Arrays 不适合OepnCl中全局大小的数组

Arrays 不适合OepnCl中全局大小的数组,arrays,memory,opencl,Arrays,Memory,Opencl,我不知道如何处理比clEnqueueNDRangeKernel中设置的全局大小更小的数组 在我的原子论计算中,全局大小是由原子数设置的。这是位置、速度和力的大小。然后,我做一个伪缩减,并将数据存储在与bloc数量相对应的数组中。我还有一个小数组来存储对势的参数 我对这个位置没有任何问题,我声明它们是\uu global const double4*positions。我的问题是关于另外两种。据我所知,线程与每个数组元素相关联,但这不是我想要的小数组。对我来说,最好的方法是将参数数组作为\uuu

我不知道如何处理比
clEnqueueNDRangeKernel
中设置的全局大小更小的数组

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

我对这个位置没有任何问题,我声明它们是
\uu global const double4*positions
。我的问题是关于另外两种。据我所知,线程与每个数组元素相关联,但这不是我想要的小数组。对我来说,最好的方法是将参数数组作为
\uuu const
\uu private
传递,但我不确定是否可以将数组作为
\uu private
传递(就像我对标量所做的那样),并将其设置为
\uu 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数组,现在我将它作为
\uu global
传递,输出只是垃圾。当我将其声明为
\uu const
时,我得到了与上述相同的错误,无论如何,我想这将是一个问题,即在以后获取数据


你们会怎么做?

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

如果希望所有工作项都使用较大的数组,然后只使用较小的数组,则可以编写代码。只需检查全局_id是否在较小数组的范围内


如果数组大小之间存在某种固定的关系,如3到1,您可以在其中处理一个大数组元素,而每个工作项只处理一个小数组元素,并使用全局大小的三分之一。

我上面提到的错误已经解决。我的错误是使用
\uuuu const
而不是
\uu constant
。因此,
clEnqueueNDRangeKernel
中设置的
全局工作大小
值正是我们想要使用的线程数,但实际上我们可以有更小或更大的数组。是吗?是的。全局大小表示“我需要这么多工作项”,每个工作项使用全局_id(0)来知道要处理什么。阵列可以大于或小于全局大小。例如,如果要从一个数组中读取4个项,然后仅将奇数工作项的和写入输出数组,则输入数组的大小将是全局大小的4倍,而输出数组的大小将是全局大小的一半。这取决于您希望内核做什么。