diff --git a/source/par2j/reedsolomon.c b/source/par2j/reedsolomon.c index 189ba71..0a91b69 100644 --- a/source/par2j/reedsolomon.c +++ b/source/par2j/reedsolomon.c @@ -1,5 +1,5 @@ // reedsolomon.c -// Copyright : 2023-10-21 Yutaka Sawada +// Copyright : 2023-10-26 Yutaka Sawada // License : GPL #ifndef _UNICODE @@ -229,8 +229,8 @@ int calc_thread_num2(int max_num, int *cpu_num2) // 読み込み中はスレッド数を減らす(シングル・スレッドの時は 0にする) num1 = 0; - i = 1; - while (i * 2 <= cpu_num){ // 1=0, 2~3=1, 4~7=2, 8~15=3, 16~31=4, 32=5 + i = 2; + while (i <= cpu_num){ // 1=0, 2~3=1, 4~7=2, 8~15=3, 16~31=4, 32=5 num1++; i *= 2; } diff --git a/source/par2j/rs_decode.c b/source/par2j/rs_decode.c index bf8e71c..58505fa 100644 --- a/source/par2j/rs_decode.c +++ b/source/par2j/rs_decode.c @@ -1,5 +1,5 @@ // rs_decode.c -// Copyright : 2023-10-25 Yutaka Sawada +// Copyright : 2023-10-27 Yutaka Sawada // License : GPL #ifndef _UNICODE @@ -1711,8 +1711,8 @@ skip_count++; } else if (src_num > src_max * 2){ // ただし、CPUスレッド担当量の 2倍までに制限する src_num = src_max * 2; } - } else if (gpu_end < cpu_end / 2){ // GPU が遅い場合は最低負担量も減らす - if (gpu_end < cpu_end / 4){ + } else if (gpu_end * 2 < cpu_end){ // GPU が遅い場合は最低負担量も減らす + if (gpu_end * 4 < cpu_end){ if (src_num < src_max / 4) src_num = src_max / 4; } else if (src_num < src_max / 2){ @@ -1731,8 +1731,15 @@ skip_count++; #endif } else if (src_off + src_num + src_max > source_num){ 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 - printf("GPU last 2: src_off = %d, src_num = %d\n", src_off, src_num); } else { printf("GPU: remain = %d, src_off = %d, src_num = %d\n", source_num - src_off, src_off, src_num); #endif @@ -2291,8 +2298,8 @@ time_read += GetTickCount() - time_start; } else if (src_num > src_max * 2){ // ただし、CPUスレッド担当量の 2倍までに制限する src_num = src_max * 2; } - } else if (gpu_end < cpu_end / 2){ // GPU が遅い場合は最低負担量も減らす - if (gpu_end < cpu_end / 4){ + } else if (gpu_end * 2 < cpu_end){ // GPU が遅い場合は最低負担量も減らす + if (gpu_end * 4 < cpu_end){ if (src_num < src_max / 4) src_num = src_max / 4; } else if (src_num < src_max / 2){ @@ -2311,8 +2318,15 @@ time_read += GetTickCount() - time_start; #endif } else if (src_off + src_num + src_max > read_num){ 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 - printf("GPU last 2: src_off = %d, src_num = %d\n", src_off, src_num); } else { printf("GPU: remain = %d, src_off = %d, src_num = %d\n", read_num - src_off, src_off, src_num); #endif diff --git a/source/par2j/rs_encode.c b/source/par2j/rs_encode.c index 4bab7bd..0831d56 100644 --- a/source/par2j/rs_encode.c +++ b/source/par2j/rs_encode.c @@ -1,5 +1,5 @@ // rs_encode.c -// Copyright : 2023-10-25 Yutaka Sawada +// Copyright : 2023-10-27 Yutaka Sawada // License : GPL #ifndef _UNICODE @@ -1797,8 +1797,8 @@ skip_count++; } else if (src_num > src_max * 2){ // ただし、CPUスレッド担当量の 2倍までに制限する src_num = src_max * 2; } - } else if (gpu_end < cpu_end / 2){ // GPU が遅い場合は最低負担量も減らす - if (gpu_end < cpu_end / 4){ + } else if (gpu_end * 2 < cpu_end){ // GPU が遅い場合は最低負担量も減らす + if (gpu_end * 4 < cpu_end){ if (src_num < src_max / 4) src_num = src_max / 4; } else if (src_num < src_max / 2){ @@ -1818,8 +1818,15 @@ skip_count++; } else if (src_off + src_num + src_max > source_num){ src_num = source_num - src_off - src_max; // 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 - printf("GPU last 2: src_off = %d, src_num = %d\n", src_off, src_num); } else { printf("GPU: remain = %d, src_off = %d, src_num = %d\n", source_num - src_off, src_off, src_num); #endif @@ -2412,7 +2419,7 @@ time_read += GetTickCount() - time_start; if (src_off + src_num * 2 - 1 >= read_num){ src_num = read_num - src_off; #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 } cpu_end += src_num; @@ -2435,8 +2442,8 @@ time_read += GetTickCount() - time_start; } else if (src_num > src_max * 2){ // ただし、CPUスレッド担当量の 2倍までに制限する src_num = src_max * 2; } - } else if (gpu_end < cpu_end / 2){ // GPU が遅い場合は最低負担量も減らす - if (gpu_end < cpu_end / 4){ + } else if (gpu_end * 2 < cpu_end){ // GPU が遅い場合は最低負担量も減らす + if (gpu_end * 4 < cpu_end){ if (src_num < src_max / 4) src_num = src_max / 4; } else if (src_num < src_max / 2){ @@ -2455,8 +2462,15 @@ time_read += GetTickCount() - time_start; #endif } else if (src_off + src_num + src_max > read_num){ 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 - printf("GPU last 2: src_off = %d, src_num = %d\n", src_off, src_num); } else { printf("GPU: remain = %d, src_off = %d, src_num = %d\n", read_num - src_off, src_off, src_num); #endif