Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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,我开始在OpenCL中进行一些开发,我的首要目标之一是将包含大量数据的库移植到OpenCL 这个特定的库以其本机C形式包含大量(内存中约20MB)数组,这些数组的值是严格恒定的,还有一些函数允许用户从这些数组中提取(有时对其执行一些基本操作)值 我将所有这些数组放在一个巨大的C源代码文件中(大约100万行),并将其与函数的代码一起编译到库中 我现在的问题是:是否有可能用必要的内存限定符将这个巨大的文件编译成使用数据集和相关函数的OpenCL内核? 同样,这些数组是常量,在执行期间不会更改 提前感

我开始在OpenCL中进行一些开发,我的首要目标之一是将包含大量数据的库移植到OpenCL

这个特定的库以其本机C形式包含大量(内存中约20MB)数组,这些数组的值是严格恒定的,还有一些函数允许用户从这些数组中提取(有时对其执行一些基本操作)值

我将所有这些数组放在一个巨大的C源代码文件中(大约100万行),并将其与函数的代码一起编译到库中

我现在的问题是:是否有可能用必要的内存限定符将这个巨大的文件编译成使用数据集和相关函数的OpenCL内核? 同样,这些数组是常量,在执行期间不会更改

提前感谢您的建议

Tom

OpenCL支持,这正是您想要的。它的工作原理与全局内存类似,尽管具体位置可能因实现而异,而且它允许编译器以不同的方式优化内容,因为保证在内核执行期间不会修改内存

您将创建此缓冲区,将其标记为只读,并从主机可访问的数据进行复制。然后,您只需正常地将其传递到内核:

float[] hugeData = { ... };

void run_kernel() {
   // ...
   cl_mem cl_hugeData;
   hugeDataInOpenCL = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(hugeData), hugeData, &error);
   // ...
   clSetKernelArg(kernel, 0, sizeof(cl_hugeData), &cl_hugeData);
   // ...
}

__kernel void mykernel (__constant float * hugeData, ...) {
   // use hugeData however you want
}
您可能希望在每个上下文中创建一次缓冲区,并重复使用它(就像在内核中一样),以避免过度重复工作


此外,您的数据足够大,某些设备可能没有足够的可用固定内存,在这种情况下,您可以退回到使用全局内存并将其标记为只读。(这意味着您的内核有两个版本,一个有两种类型的参数。)检查
clGetDeviceInfo
查看
CL\u设备\u最大值\u常量\u缓冲区\u大小
并在运行时决定。

谢谢您的回复,但这不是我想要的。如果我没有说清楚,我很抱歉。数组应该作为全局变量在内核中编译。我特别希望避免将它们作为参数发送到内核。数组实际上是数组的数组,有很多数组。如何访问数组?OpenCL实际上只提供两个选项:1)参数,2)代码。如果我们谈论的是兆字节的数据,它几乎必须是参数。数组将使用与内核一起编译的函数进行访问。如果我必须将这些数组设置为内核参数,这将变得非常混乱。OpenCL允许您使用
\u常量
限定符声明全局变量,您可以从内核中隐式访问它们,就像从C中访问一样。然而,
CL\u设备\u MAX\u常量\u缓冲区大小
通常为64 KB。如果你想传递大量的数据,你需要使用参数,并且需要相应地重构。Tom,你有没有考虑过使用
图像
来存储数据,并将
采样器
传递到内核中以访问数据?