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

Posted

技术标签:

【中文标题】OpenCL:GPU 上的单个计算设备?【英文标题】:OpenCL: single compute device on GPU? 【发布时间】:2017-02-08 10:25:17 【问题描述】:

所以我在 GeForce GT 610 上运行我的 OpenCL 程序。我知道 CUDA 会是一个更好的选择,我以后可能会编写我的代码的 CUDA 版本,但是要知道我在 OpenCL 中编写也是为了能够在 AMD 显卡上运行。

在初始化期间,我选择了一个要运行的设备。这是我的程序在此阶段打印的内容:

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);

【问题讨论】:

【参考方案1】:

我的问题是为什么它说最大计算单元只有 1?

这里提到的计算单元对应于NVIDIA GPU SM(流式多处理器)。该 GPU 只有一个 SM,其中有 48 个内核。

因此,您不仅限于单核或该 GPU 能力的 1/48。访问该计算单元意味着您的程序将可以访问其中包含的 48 个内核。

【讨论】:

啊,有道理。谢谢你。我将如何确定我可以在此设备上并行运行多少线程? 您可以启动一个使用许多线程(工作项)的 OpenCL 内核。 GPU 将以它能够处理的任何速率处理它们。 GPU 的瞬时容量是指定的(例如,每个 Fermi SM 可以驻留 1536 个工作项),但这意味着您应该考虑编写使用 1536 个工作项的全局大小(或本地大小,就此而言)。使用对您的问题有意义的尽可能大的工作结构。在这种情况下,不必担心 1536 号码。

以上是关于OpenCL:GPU 上的单个计算设备?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCL。如何确定哪个计算设备是空闲的并相应地提交作业?

移动端异构运算技术-GPU OpenCL 编程(基础篇)

1 个 cpu 设备上 OpenCL 的并行性

在 OpenCl 中,多个 gpu 比单个 gpu 慢。我怎样才能更快?

将 OSX 上的 OpenCL 设备设置为专用的 AMD GPU

对 nvidia GPU 上的计算单元和预期内核的混淆