OpenCL:GPU上的单个计算设备?

3
我正在GeForce GT 610上运行我的OpenCL程序。我知道CUDA可能是更好的选择,但现在为了能够在AMD显卡上运行,我正在使用OpenCL编写代码。在初始化期间,我会选择一个设备来运行程序。以下是该阶段程序输出的内容:
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网站上的规格细节,它有48个CUDA核心。我知道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);

...循环内部...

  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);
1个回答

4
我的问题是为什么它说最大计算单元只有1个?
这里所指的计算单元对应于 NVIDIA GPU SM(流多处理器)。该GPU恰好有一个SM,其中包含48个核心。
因此,您不会受限于单个核心或该GPU能力的1/48。访问该计算单元意味着您的程序将可以访问其中包含的48个核心。

啊,那就说得通了。谢谢你。我该如何找出在这个设备上可以同时运行多少个线程? - danglingPointer
1
您可以启动使用多个线程(工作项)的OpenCL内核。 GPU将以其能够处理的任何速率进行处理。 GPU的瞬时容量已指定(例如,每个Fermi SM可以驻留1536个工作项),但这并不意味着您应该考虑编写使用1536个工作项作为全局大小(或本地大小)的程序。 使用尽可能大的工作结构,使其对您的问题有意义。 在这种情况下,不必担心1536个数字。 - Robert Crovella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接