通过JOCL进行GPU编程仅使用80个着色器核心中的6个?

时间:2012-01-04 00:41:32

标签: opencl gpgpu jocl

我试图让程序在我的GPU上运行并从一个简单的示例开始我修改了http://www.jocl.org/samples/samples.html上的第一个样本并运行以下小脚本:我同时运行n个“线程”(什么是GPU等效线程的正确名称?),每个执行20000000 / n个独立的tanh() - 计算。您可以在此处查看我的代码:http://pastebin.com/DY2pdJzL

速度远远超出我的预期:

  • 对于n = 1需要12.2秒
  • 对于n = 2需要6.3秒
  • 对于n = 3,需要4.4秒
  • 对于n = 4需要3.4秒
  • 对于n = 5需要3.1秒
  • 对于n = 6及更高,需要2.7秒。

因此,在n = 6之后(n = 8,n = 20,n = 100,n = 1000或n = 100000),没有性能增加,这意味着只有6个并行计算。但是,根据我的卡的规格,应该有80个核心:http://www.amd.com/us/products/desktop/graphics/ati-radeon-hd-5000/hd-5450-overview/pages/hd-5450-overview.aspx#2

这不是开销问题,因为增加或减少20000000只会在所有执行时间中产生线性因素。

我已经安装了支持OpenCL的AMD APP SDK和驱动程序:有关详细信息,请参阅http://dl.dropbox.com/u/3060536/prtscr.pnghttp://dl.dropbox.com/u/3060536/prtsrc2.png(或者至少从这些结论中可以看出OpenCL运行正常)。

所以我现在有点无能为力,在哪里寻找答案。为什么JOCL只能在我的ATI Radeon HD 5450上执行6次并行执行?

1 个答案:

答案 0 :(得分:1)

您正在将本地工作大小硬编码为1.使用更大的尺寸或让司机为您选择一个。

此外,您的内核不是以OpenCL风格设计的。您应该取出for循环并让驱动程序为您处理迭代。