私は OpenCL を初めて使用し、配列の追加に問題があります。以下のリンクで提供されているコードを使用します。
GPUのパフォーマンスを測定するためにいくつかの部品を追加しました
clFinish(commandQueue);
// Queue the kernel up for execution across the array
cl_ulong start, end; cl_event k_events;
errNum = clEnqueueNDRangeKernel(commandQueue, kernel, 1, NULL,
globalWorkSize, localWorkSize,
0, NULL, &k_events);
clGetEventProfilingInfo(k_events, CL_PROFILING_COMMAND_START,
sizeof(cl_ulong), &start, NULL);
clWaitForEvents(1 , &k_events);
clGetEventProfilingInfo(k_events, CL_PROFILING_COMMAND_END,
sizeof(cl_ulong), &end, NULL);
clGetEventProfilingInfo(k_events, CL_PROFILING_COMMAND_START,
sizeof(cl_ulong), &start, NULL);
float GPUTime = (end - start);
そして、これはCPU時間を測定するために
LARGE_INTEGER CPUstart, finish, freq;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&CPUstart);
for (int i=0;i<ARRAY_SIZE;i++){
result[i]=a[i]+b[i];
}
QueryPerformanceCounter(&finish);
double timeCPU=(finish.QuadPart - CPUstart.QuadPart) /((double)freq.QuadPart)/1000000000.0) ;
私が遭遇した最初の問題は、配列のサイズです。10000 を超えることはできません。私がこれを行う場合; クラッシュするだけです。それを修正する方法?
2 番目の問題はパフォーマンスです。GPU/CPU 比率の範囲が広すぎます。13% から 210% (ish) まで。なぜこれが起こるのですか?修正を提案できますか?
編集:2番目を理解しました。遅延は省電力モードが原因でした。コア/メモリをデフォルトよりもはるかに低く設定しました。プログラムを使用してロックするだけです。パフォーマンスは ~150-300 % (GPU/CPU) で安定しています。
良いケース
GPU time :632667 nanosecs.
CPU time : 990023 nanosecs.
GPU/CPU ratio : 156.484 percent.
そして悪いもの:
GPU time :6.83267e+006 nanosecs.
CPU time : 1.00756e+006 nanosecs.
GPU/CPU ratio : 14.7462 percent.
任意のアイデアをいただければ幸いです。ありがとう:D
PS: CPU はコア i3-370M です。GPU: HD5470。Windows 7でVS2008を使用しています