OpenCL:__constant memory和const __global memory之间的区别

Bal*_*egi 7 const opencl

我想了解当我创建具有只读属性的缓冲区并__constant在内核中使用const __global地址空间限定符或将其与地址空间限定符一起使用时的区别.

我已经发现的那些不是我的问题的真正答案,但它们包含一些有用的信息:

如果我理解的话,GPU内存中的分配发生在clCreateBuffer函数调用中.所以我不明白的是编译器如何决定缓冲区是在常量内存(有64 KB的限制)还是在全局内存中.(我知道在大多数情况下,常量内存是全局内存空间的一部分.)如果它取决于地址限定符,则意味着可以忽略64 KB限制const __global.

是否有之间的性能有什么区别__constantconst __global?__global内存可以被缓存,因此它们都是只读的,并且(可能)被缓存.(来源:3.3内存模型/全局内存部分和图3.3; http://www.khronos.org/registry/cl/specs/opencl-1.x-latest.pdf#page=24)

mcd*_*d40 3

根据我的经验,两者之间没有概念上的区别,它们都意味着所指向的数据是只读的。只有根据供应商使用的实现方式,差异才会显现出来。

例如,在 nvidia GPU 上,标有 __constant 的内存会被缓存(我相信对于所有当前设备,每个多处理器的缓存大小为 8KB)。需要注意的一件事是,如果不同的工作项访问不同的地址,则对该缓存的访问会被序列化,因此我发现它对于传递工作组内恒定的参数结构最有用。如果您查看 CUDA 编程指南中有关常量内存的部分,您将更好地了解其工作原理。我相信标记为 const __global 的内存不会被缓存,它只是告诉编译器在尝试更改指向的值时抛出错误。

我不确定 AMD 是否在他们的硬件上做了类似的缓存

希望有帮助