Improve GPU function a little

This commit is contained in:
Yutaka Sawada
2023-10-27 13:31:56 +09:00
committed by GitHub
parent e979c07600
commit 5660fcf7c5
3 changed files with 46 additions and 18 deletions

View File

@@ -1,5 +1,5 @@
// reedsolomon.c // reedsolomon.c
// Copyright : 2023-10-21 Yutaka Sawada // Copyright : 2023-10-26 Yutaka Sawada
// License : GPL // License : GPL
#ifndef _UNICODE #ifndef _UNICODE
@@ -229,8 +229,8 @@ int calc_thread_num2(int max_num, int *cpu_num2)
// 読み込み中はスレッド数を減らす(シングル・スレッドの時は 0にする // 読み込み中はスレッド数を減らす(シングル・スレッドの時は 0にする
num1 = 0; num1 = 0;
i = 1; i = 2;
while (i * 2 <= cpu_num){ // 1=0, 2~3=1, 4~7=2, 8~15=3, 16~31=4, 32=5 while (i <= cpu_num){ // 1=0, 2~3=1, 4~7=2, 8~15=3, 16~31=4, 32=5
num1++; num1++;
i *= 2; i *= 2;
} }

View File

@@ -1,5 +1,5 @@
// rs_decode.c // rs_decode.c
// Copyright : 2023-10-25 Yutaka Sawada // Copyright : 2023-10-27 Yutaka Sawada
// License : GPL // License : GPL
#ifndef _UNICODE #ifndef _UNICODE
@@ -1711,8 +1711,8 @@ skip_count++;
} else if (src_num > src_max * 2){ // ただし、CPUスレッド担当量の 2倍までに制限する } else if (src_num > src_max * 2){ // ただし、CPUスレッド担当量の 2倍までに制限する
src_num = src_max * 2; src_num = src_max * 2;
} }
} else if (gpu_end < cpu_end / 2){ // GPU が遅い場合は最低負担量も減らす } else if (gpu_end * 2 < cpu_end){ // GPU が遅い場合は最低負担量も減らす
if (gpu_end < cpu_end / 4){ if (gpu_end * 4 < cpu_end){
if (src_num < src_max / 4) if (src_num < src_max / 4)
src_num = src_max / 4; src_num = src_max / 4;
} else if (src_num < src_max / 2){ } else if (src_num < src_max / 2){
@@ -1731,8 +1731,15 @@ skip_count++;
#endif #endif
} else if (src_off + src_num + src_max > source_num){ } else if (src_off + src_num + src_max > source_num){
src_num = source_num - src_off - src_max; src_num = source_num - src_off - src_max;
if ((src_num < src_max) && (src_num + src_max <= vram_max) && (gpu_end * 2 > cpu_end)){
src_num += src_max; // GPU担当量が少なくて、余裕がある場合は、残りも全て任せる
#ifdef TIMER
printf("GPU last +: src_off = %d, src_num = %d + %d\n", src_off, src_num - src_max, src_max);
} else {
printf("GPU last 2: src_off = %d, src_num = %d\n", src_off, src_num);
#endif
}
#ifdef TIMER #ifdef TIMER
printf("GPU last 2: src_off = %d, src_num = %d\n", src_off, src_num);
} else { } else {
printf("GPU: remain = %d, src_off = %d, src_num = %d\n", source_num - src_off, src_off, src_num); printf("GPU: remain = %d, src_off = %d, src_num = %d\n", source_num - src_off, src_off, src_num);
#endif #endif
@@ -2291,8 +2298,8 @@ time_read += GetTickCount() - time_start;
} else if (src_num > src_max * 2){ // ただし、CPUスレッド担当量の 2倍までに制限する } else if (src_num > src_max * 2){ // ただし、CPUスレッド担当量の 2倍までに制限する
src_num = src_max * 2; src_num = src_max * 2;
} }
} else if (gpu_end < cpu_end / 2){ // GPU が遅い場合は最低負担量も減らす } else if (gpu_end * 2 < cpu_end){ // GPU が遅い場合は最低負担量も減らす
if (gpu_end < cpu_end / 4){ if (gpu_end * 4 < cpu_end){
if (src_num < src_max / 4) if (src_num < src_max / 4)
src_num = src_max / 4; src_num = src_max / 4;
} else if (src_num < src_max / 2){ } else if (src_num < src_max / 2){
@@ -2311,8 +2318,15 @@ time_read += GetTickCount() - time_start;
#endif #endif
} else if (src_off + src_num + src_max > read_num){ } else if (src_off + src_num + src_max > read_num){
src_num = read_num - src_off - src_max; src_num = read_num - src_off - src_max;
if ((src_num < src_max) && (src_num + src_max <= vram_max) && (gpu_end * 2 > cpu_end)){
src_num += src_max; // GPU担当量が少なくて、余裕がある場合は、残りも全て任せる
#ifdef TIMER
printf("GPU last +: src_off = %d, src_num = %d + %d\n", src_off, src_num - src_max, src_max);
} else {
printf("GPU last 2: src_off = %d, src_num = %d\n", src_off, src_num);
#endif
}
#ifdef TIMER #ifdef TIMER
printf("GPU last 2: src_off = %d, src_num = %d\n", src_off, src_num);
} else { } else {
printf("GPU: remain = %d, src_off = %d, src_num = %d\n", read_num - src_off, src_off, src_num); printf("GPU: remain = %d, src_off = %d, src_num = %d\n", read_num - src_off, src_off, src_num);
#endif #endif

View File

@@ -1,5 +1,5 @@
// rs_encode.c // rs_encode.c
// Copyright : 2023-10-25 Yutaka Sawada // Copyright : 2023-10-27 Yutaka Sawada
// License : GPL // License : GPL
#ifndef _UNICODE #ifndef _UNICODE
@@ -1797,8 +1797,8 @@ skip_count++;
} else if (src_num > src_max * 2){ // ただし、CPUスレッド担当量の 2倍までに制限する } else if (src_num > src_max * 2){ // ただし、CPUスレッド担当量の 2倍までに制限する
src_num = src_max * 2; src_num = src_max * 2;
} }
} else if (gpu_end < cpu_end / 2){ // GPU が遅い場合は最低負担量も減らす } else if (gpu_end * 2 < cpu_end){ // GPU が遅い場合は最低負担量も減らす
if (gpu_end < cpu_end / 4){ if (gpu_end * 4 < cpu_end){
if (src_num < src_max / 4) if (src_num < src_max / 4)
src_num = src_max / 4; src_num = src_max / 4;
} else if (src_num < src_max / 2){ } else if (src_num < src_max / 2){
@@ -1818,8 +1818,15 @@ skip_count++;
} else if (src_off + src_num + src_max > source_num){ } else if (src_off + src_num + src_max > source_num){
src_num = source_num - src_off - src_max; src_num = source_num - src_off - src_max;
// src_num が 0にならないように、src_num == src_max なら上の last1 にする // src_num が 0にならないように、src_num == src_max なら上の last1 にする
if ((src_num < src_max) && (src_num + src_max <= vram_max) && (gpu_end * 2 > cpu_end)){
src_num += src_max; // GPU担当量が少なくて、余裕がある場合は、残りも全て任せる
#ifdef TIMER
printf("GPU last +: src_off = %d, src_num = %d + %d\n", src_off, src_num - src_max, src_max);
} else {
printf("GPU last 2: src_off = %d, src_num = %d\n", src_off, src_num);
#endif
}
#ifdef TIMER #ifdef TIMER
printf("GPU last 2: src_off = %d, src_num = %d\n", src_off, src_num);
} else { } else {
printf("GPU: remain = %d, src_off = %d, src_num = %d\n", source_num - src_off, src_off, src_num); printf("GPU: remain = %d, src_off = %d, src_num = %d\n", source_num - src_off, src_off, src_num);
#endif #endif
@@ -2412,7 +2419,7 @@ time_read += GetTickCount() - time_start;
if (src_off + src_num * 2 - 1 >= read_num){ if (src_off + src_num * 2 - 1 >= read_num){
src_num = read_num - src_off; src_num = read_num - src_off;
#ifdef TIMER #ifdef TIMER
printf("lastC: src_off = %d, src_num = %d\n", src_off, src_num); printf("CPU last: src_off = %d, src_num = %d\n", src_off, src_num);
#endif #endif
} }
cpu_end += src_num; cpu_end += src_num;
@@ -2435,8 +2442,8 @@ time_read += GetTickCount() - time_start;
} else if (src_num > src_max * 2){ // ただし、CPUスレッド担当量の 2倍までに制限する } else if (src_num > src_max * 2){ // ただし、CPUスレッド担当量の 2倍までに制限する
src_num = src_max * 2; src_num = src_max * 2;
} }
} else if (gpu_end < cpu_end / 2){ // GPU が遅い場合は最低負担量も減らす } else if (gpu_end * 2 < cpu_end){ // GPU が遅い場合は最低負担量も減らす
if (gpu_end < cpu_end / 4){ if (gpu_end * 4 < cpu_end){
if (src_num < src_max / 4) if (src_num < src_max / 4)
src_num = src_max / 4; src_num = src_max / 4;
} else if (src_num < src_max / 2){ } else if (src_num < src_max / 2){
@@ -2455,8 +2462,15 @@ time_read += GetTickCount() - time_start;
#endif #endif
} else if (src_off + src_num + src_max > read_num){ } else if (src_off + src_num + src_max > read_num){
src_num = read_num - src_off - src_max; src_num = read_num - src_off - src_max;
if ((src_num < src_max) && (src_num + src_max <= vram_max) && (gpu_end * 2 > cpu_end)){
src_num += src_max; // GPU担当量が少なくて、余裕がある場合は、残りも全て任せる
#ifdef TIMER
printf("GPU last +: src_off = %d, src_num = %d + %d\n", src_off, src_num - src_max, src_max);
} else {
printf("GPU last 2: src_off = %d, src_num = %d\n", src_off, src_num);
#endif
}
#ifdef TIMER #ifdef TIMER
printf("GPU last 2: src_off = %d, src_num = %d\n", src_off, src_num);
} else { } else {
printf("GPU: remain = %d, src_off = %d, src_num = %d\n", read_num - src_off, src_off, src_num); printf("GPU: remain = %d, src_off = %d, src_num = %d\n", read_num - src_off, src_off, src_num);
#endif #endif