Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCL-在私有内存中存储大型阵列_Opencl - Fatal编程技术网

OpenCL-在私有内存中存储大型阵列

OpenCL-在私有内存中存储大型阵列,opencl,Opencl,我有一个很大的float数组,称为source\u数组,大小约为50000。我目前正在尝试在阵列上实现一系列修改,并对其进行评估。基本上是伪代码: __kernel void doSomething (__global float *source_array, __global boolean *res. __global int *mod_value) { // Modify values of source_array with mod_value; // Evaluat

我有一个很大的
float
数组,称为
source\u数组
,大小约为50000。我目前正在尝试在阵列上实现一系列修改,并对其进行评估。基本上是伪代码:

__kernel void doSomething (__global float *source_array, __global boolean *res. __global int *mod_value) {
     // Modify values of source_array with mod_value;
     // Evaluate the modified array.
} 
所以在这个过程中,我需要一个变量来保存修改后的数组,因为
source\u array
对于所有工作项都应该是一个常量,如果我直接修改它,它可能会干扰另一个工作项(不确定我是否在这里)

问题是数组对于私有内存来说太大了,因此我无法在内核代码中初始化。在这种情况下我该怎么办


我考虑在方法中加入另一个参数,作为修改后数组的占位符,但它同样会引用其他工作项。

为什么不在OpenCL主机内存缓冲区中初始化此数组。即

const size_t buffer_size = 50000 * sizeof(float);
/* cl_malloc, malloc or new float [50000] or = {0.1f,0.2f,...} */
float *host_array_ptr = (float*)cl_malloc(buffer_size);
/* 
    put your data into host_array_ptr hear 
*/
cl_int err_code;
cl_mem my_array = clCreateBuffer( my_cl_context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, buffer_size, host_array_ptr, &err_code );
然后您可以在OpenCL内核中使用这个
cl\u mem my\u数组

GPU上的私有“内存”实际上是由寄存器组成的,这些寄存器通常供不应求。因此,OpenCL中的
\u private
地址空间不适合这种情况,我相信您已经发现了这一点

Victor的答案是正确的——如果您确实需要每个工作项的临时内存,那么您需要创建一个(全局)缓冲区对象。如果所有工作项都需要独立地对其进行变异,那么它将需要
*
的大小,并且每个工作项都需要使用自己的缓冲区片。如果它只是临时的,您永远不需要将它复制回主机内存


然而,这听起来像是一种在GPU上工作效率很低的访问模式。如果你以不同的方式分解问题,你会做得更好。例如,您可以使整个工作组在数组的某个子范围上协调工作-将子范围复制到本地(组共享)内存中,工作在组中的工作项之间分配,结果写回全局内存,下一个子范围读取到本地,等等。组中工作项之间的协调比每个工作项访问大范围全局内存的效率要高得多。只有当您更具体地了解要执行的计算时,我们才能使用这种算法方法帮助您。

如果我想更改内核代码中的数组值,我会工作吗?如果它是只读的,那么我不能这样做,对吗?那么当工作项并行运行时,它们将对同一对象进行更改,因此我对每个工作项的评估将不准确..因为您可以克隆这些缓冲区,同步访问等。我想问题是在私有内存之外存储大内存块。有些文档我已经知道如何将数组存储在主机中或将其传递到内核中,问题是我想创建一个数组来存储修改后的数组值,并将其用于内核内方法,而不保存它。我不需要将它保存在方法的范围之外。如果您在私有vram中没有内存,如何执行此操作?您可以在cl内核内部使用主机内存缓冲区,这是一个主机应用程序处理来管理此内存。既然你已经发布了它,我完全理解你的意思,而且创建一个有空间容纳所有物品的大数组并不是一个好主意。我会像你说的那样,分解问题。非常感谢。