0

我有一些用 C++ 编写的代码,它利用了多线程。

我取消了一个数组,并且可以这样总结程序(在多次运行的多个线程上运行),即 -1/+1 随机数的总和

runningTotal += ((rng_1.rand_cmwc()%range + 1) <= halfRange ? 1: -1);

rng_1.rand_cmwc() 指的是cmwc 类的一个函数,rng_1 是对象。

我在 OpenCl (http://opencl.codeplex.com/wikipage?title=OpenCL%20Tutorials%20-%201) 上做了一些阅读,我有库设置,并编译了我自己的主机。

这导致我提出问题#1

这个类在 OpenCL 中不存在,所以我想我需要创建一个内核来保存这个类。

变量:

runningTotal 很长

range 是一个 const long

halfRange 是一个 const long(即 range/2)

我的第二个问题是。

因为它不是一个数组(大多数 OpenCL 教程都讨论了如何让 OpenCL 同时在一个数组中分配多个元素)。

我该如何设置

  runningTotal += ((rng_1.rand_cmwc()%range + 1) <= halfRange ? 1: -1);

在多个内核上运行?我做一个工作组吗?

有人可以举例说明我将如何执行引用多个内核的 cl_program clCreateProgramWithSource 命令吗?

我确定我会有更多问题,但我想我需要两个内核,每个都运行它自己的工作组?一个用于我的 cmwc 类,一个用于 runningTotal 总和。

然后以某种方式每隔一段时间将所有工作项同步到更大的总数。

4

1 回答 1

1

第一个问题:我相信只有 AMD 通过名为静态 C++ 内核语言的扩展支持在内核中使用类(参见http://developer.amd.com/Assets/CPP_kernel_language.pdf

第二个问题:要并行求和,您必须使用并行求和算法,例如前缀求和(http://en.wikipedia.org/wiki/Prefix_sum)或归约(http://developer.amd.com/Resources /documentation/articles/Pages/OpenCL-Optimization-Case-Study-Simple-Reductions.aspx)。请注意,存在为此的库。

希望有帮助。祝你好运 :)

于 2012-10-25T15:07:35.153 回答