在OpenCl中不适合全局大小的数组

时间:2013-09-29 23:04:10

标签: arrays memory opencl

我无法想象如何处理大小小于clEnqueueNDRangeKernel中全局大小的数组。

在我的原子计算中,全局大小由原子数设定。这是位置,速度和力量的大小。然后,我进行伪缩减并将数据存储在与块数相对应的数组中。我还有一个小数组来存储该对潜在的参数。

我对该职位没有任何问题,我将其声明为__global const double4 *positions。我的问题是关于另外两种。根据我的理解,一个线程与每个数组元素相关联,但这不是我想要的小数组。对我而言,最好的方法是将参数数组作为__const__private传递,但我不确定我是否可以将数组作为__private传递(就像我使用标量一样)并将其设置为__const会产生错误:

:149:80: error: invalid address space for pointee of pointer argument to __kernel function
                         __global float2 *atom_type,__global const double *atmmass, __const double8 *two_body_type,

关于我的reduce数组,现在我将它作为__global传递,输出只是垃圾。当我将其声明为__const时,我得到了与上面相同的错误,无论如何,我想这将是以后获取数据的问题。

你们怎么做?

1 个答案:

答案 0 :(得分:1)

输入或输出数组与内核执行的全局大小之间的关系不是由OpenCL修复或定义的,它完全取决于你的内核。

如果您希望所有工作项使用更大的数组,然后只有某些使用较小的数组,则可以对其进行编码。只需检查global_id是否在较小数组的范围内。

如果数组大小之间存在某种固定的关系,例如3比1,那么您可能会处理大型数组元素,而只处理每个工作项的一个小数组元素,并使用全局大小的三分之一。