Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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
Qt 将全局内存用于(大)本地/专用温度。OpenCL中高效的数据结构_Qt_Memory Management_Opencl - Fatal编程技术网

Qt 将全局内存用于(大)本地/专用温度。OpenCL中高效的数据结构

Qt 将全局内存用于(大)本地/专用温度。OpenCL中高效的数据结构,qt,memory-management,opencl,Qt,Memory Management,Opencl,我正在用OpenCL编写一个算法,它只需要暂时(在执行期间)的数据结构。这将是大到足以超过大多数设备的本地或私有内存。所以我必须使用全局内存来存储这些数据 我读过OpenCL中不同的内存类型,我知道随机访问全局内存非常慢。在我的例子中,每个工作组访问全局内存中的不同地址,因此换句话说,我使用全局内存作为一种本地内存 所以我现在问自己,如果设备“知道”我没有读取另一个工作组/项目写入的数据,那么内存访问是否可以加快?在内存访问机制方面,\u常量究竟起到什么作用?我可以误用这个或类似的关键字吗?或者

我正在用OpenCL编写一个算法,它只需要暂时(在执行期间)的数据结构。这将是大到足以超过大多数设备的本地或私有内存。所以我必须使用全局内存来存储这些数据

我读过OpenCL中不同的内存类型,我知道随机访问全局内存非常慢。在我的例子中,每个工作组访问全局内存中的不同地址,因此换句话说,我使用全局内存作为一种本地内存

所以我现在问自己,如果设备“知道”我没有读取另一个工作组/项目写入的数据,那么内存访问是否可以加快?在内存访问机制方面,
\u常量
究竟起到什么作用?我可以误用这个或类似的关键字吗?或者对于我忽略的问题,是否有一个关键字/方法

另一件事是:这个数据结构的内存只需要在设备的内存中分配;我不需要在主机中访问(甚至不初始化)它。有没有比向设备发送未初始化的数组更有效的方法?我使用QtOpenCL,它允许我传递一个主机初始化的原语向量,该原语向量在内部转换(主机-)到缓冲区,并在内核调用时发送到设备。所以我正在寻找一种QtOpenCL方法来实现这一点。另外,只能从内核内部分配本地内存。(我在将数组定义为
\uu global
时出错)


提前谢谢

由于恒定缓冲区的大小通常很小(例如,我的GTX 580上有64kB的缓冲区,并且该大小在所有工作组中共享,类似于48kB的本地内存),因此我认为使用恒定缓冲区不是一个解决方案。我建议看一下图片——在优化示例中经常使用这些图片——这些图片是为2D空间位置缓存的,访问不需要合并

顺便说一句,我在某个地方看到,在NVidia上使用某些编译器选项禁用一级缓存可以稍微提高对全局内存的随机访问的性能


对于第二个问题:我认为如果您没有通过任何
CL\u MEM\u USE\u HOST\u PTR
CL\u MEM\u ALLOC\u HOST\u PTR
CL\u MEM\u COPY\u HOST\u PTR
标记,则主机上的内存没有分配,因此无法复制到设备上。

对于您的情况,恐怕没有办法改善对全局内存的访问(虽然合并的内存访问和预取几乎可以完全隐藏延迟)。但是,您可以尝试将变量声明为本地变量,并让编译器决定哪些变量应移动到全局内存。