2
所以我在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);
...里面for循环...
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个工作项目可以驻留在费米SM上),但这不*意味着您应该考虑编写使用1536个工作项目的全球规模(或当地规模)的程序物)。使用大量的工作结构来解决问题。在这种情况下,不要担心担心1536号码。 –