我在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很长
范围是一个长的
halfRange是一个const长(即范围/ 2)
我的第二个问题是。
因为它不是一个数组(大多数OpenCL教程讨论如何让OpenCL同时在一个数组中分配多个元素)。
如何设置
runningTotal += ((rng_1.rand_cmwc()%range + 1) <= halfRange ? 1: -1);
在多个核心上运行?我做工作组吗?
有人可以举例说明我如何执行引用多个内核的cl_program clCreateProgramWithSource命令吗?
我确定我会有更多问题,但我想我需要两个内核,每个内核都运行自己的工作组?一个用于我的cmwc类,一个用于runningTotal总和。
然后以某种方式将所有工作项经常同步到更大的总数。
答案 0 :(得分:1)
第一个问题:我认为只有AMD支持通过名为Static C ++ Kernel language的扩展来支持在内核中使用类(参见http://developer.amd.com/Assets/CPP_kernel_language.pdf)
第二个问题:要并行进行求和,必须使用并行求和算法,例如前缀sum(http://en.wikipedia.org/wiki/Prefix_sum)或reduction(http://developer.amd。 COM /资源/文件/条/页/ OpenCL的 - 优化 - 案例研究 - 简单Reductions.aspx)。请注意,此处存在库。
希望有所帮助。祝你好运:)