私はGeForce GT 610でOpenCLプログラムを実行しています.CUDAがより良い選択肢になることは知っていますが、後でCUDA版のコードを書くかもしれませんが、OpenCLで書いていますAMDのグラフィックスカードで実行することができます。OpenCL:GPU上の単一計算デバイスですか?
初期化中に、実行するデバイスを選択します。ここに私のプログラムがこの段階でプリントアウトするものがあります:
OpenCL Platform 0: NVIDIA CUDA
----- OpenCL Device # 0: GeForce GT 610-----
Gflops: 1.620000
Max Compute Units: 1
Max Clock Frequency: 1620
Total Memory of Device (bytes): 1072889856
Max Size of Memory Object Allocation (bytes): 268222464
Max Work Group Size: 1024
私の質問はなぜ最大計算ユニットが1だと言いますか? GeForceサイトの仕様の詳細によると、it has 48 CUDA cores。私はCUDAがNvidiaカードでうまく動作することを知っていますが、実際にはこれを多く制限していますか? NvidiaはOpenCLを電力の1/48に制限していますか?私の質問は、なぜそれが最大の計算を言うんです
if (clGetPlatformInfo(platforms[platform], CL_PLATFORM_NAME, sizeof(name), name, NULL)) Fatal("Cannot get OpenCL platform name\n");
if (verbose) printf("OpenCL Platform %d: %s\n", platform, name);
... forloop内部...
cl_uint compUnits, freq;
cl_ulong memSize, maxAlloc;
size_t maxWorkGrps;
if (clGetDeviceInfo(id[devId], CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(compUnits), &compUnits, NULL)) Fatal("Cannot get OpenCL device units\n");
if (clGetDeviceInfo(id[devId], CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof(freq), &freq, NULL)) Fatal("Cannot get OpenCL device frequency\n");
if (clGetDeviceInfo(id[devId], CL_DEVICE_NAME, sizeof(name), name, NULL)) Fatal("Cannot get OpenCL device name\n");
if (clGetDeviceInfo(id[devId], CL_DEVICE_GLOBAL_MEM_SIZE, sizeof(memSize), &memSize, NULL)) Fatal("Cannot get OpenCL memory size.\n");
if (clGetDeviceInfo(id[devId], CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof(memSize), &maxAlloc, NULL)) Fatal("Cannot get OpenCL memory size.\n");
if (clGetDeviceInfo(id[devId], CL_DEVICE_MAX_WORK_GROUP_SIZE, sizeof(maxWorkGrps), &maxWorkGrps, NULL)) Fatal("Cannot get OpenCL max work group size\n");
int Gflops = compUnits * freq;
if (verbose) printf(" ----- OpenCL Device # %d: %s-----\n"
"Gflops: %f\n"
"Max Compute Units: %d\n"
"Max Clock Frequency: %d\n"
"Total Memory of Device (bytes): %lu\n"
"Max Size of Memory Object Allocation (bytes): %lu\n"
"Max Work Group Size: %d\n",
devId,
name,
1e-3*Gflops,
compUnits,
freq,
memSize,
maxAlloc,
maxWorkGrps);
ああ、意味があります。ありがとうございました。このデバイスで並列に実行できるスレッドの数を正確に把握するにはどうすればよいですか? – danglingPointer
多くのスレッド(作業項目)を使用するOpenCLカーネルを起動できます。 GPUは、それが可能な速度で処理します。 GPUの瞬時容量が指定されています(例えば、1536個の作業項目がFermi SMに常駐することができます)。しかし、これは、グローバルサイズ(またはそのローカルサイズ)に対して1536個の作業項目を使用するプログラムを書くことについて考えるべきではありません問題)。あなたの問題に合った大きな作業構造を使用してください。この場合、1536番号について心配することはありません。 –