我无法想象如何处理大小小于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
时,我得到了与上面相同的错误,无论如何,我想这将是以后获取数据的问题。
你们怎么做?
答案 0 :(得分:1)
输入或输出数组与内核执行的全局大小之间的关系不是由OpenCL修复或定义的,它完全取决于你的内核。
如果您希望所有工作项使用更大的数组,然后只有某些使用较小的数组,则可以对其进行编码。只需检查global_id是否在较小数组的范围内。
如果数组大小之间存在某种固定的关系,例如3比1,那么您可能会处理大型数组元素,而只处理每个工作项的一个小数组元素,并使用全局大小的三分之一。