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

Opencl 通过JOCL进行GPU编程仅使用80个着色器内核中的6个?,opencl,gpgpu,jocl,Opencl,Gpgpu,Jocl,我试图让一个程序在我的GPU上运行,从一个简单的示例开始,我修改了第一个示例,并运行以下小脚本:我同时运行n个“线程”(GPU线程的正确名称是什么?),每个线程执行20000000/n独立的tanh()计算。您可以在此处看到我的代码: 速度远远不是我所期望的: 对于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=100

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

速度远远不是我所期望的:

  • 对于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芯:

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

我已经安装了支持OpenCL的AMD应用程序SDK和驱动程序:有关详细信息,请参阅和(或者至少我可以从中得出OpenCL运行正常的结论)


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

您正在将本地工作大小硬编码为1。使用较大的尺寸或让驾驶员为您选择一个


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

感谢您的提示,将其更改为null会产生大约11倍的加速,所以看起来更像这样!我真的看不出内核有什么问题。在内核中迭代可以帮助迁移静态成本。在这种特定情况下,循环基本上执行一个缩减操作,因此让每个内核执行整个循环比尝试对多个线程的结果进行缩减要简单得多,而且可能更快。当然,只要一个人仍然可以得到足够的线程(意味着几千个)