2013-08-01 146 views
4

我想了解当我创建一个具有只读属性的缓冲区并将其与__constant地址空间限定符一起用于内核或与const __global地址空间一起使用时预选赛。OpenCL:__constant内存和const之间的区别__global内存

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

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

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

+0

我的猜测是依赖于OpenCL实现和/或硬件架构。 –

回答

1

根据我的经验,两者之间没有概念上的区别,它们都暗示指向的数据是只读的。根据供应商使用的实施情况,差异才显而易见。

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

我不知道AMD是否做类似类型的缓存在他们的硬件

希望帮助

+0

你确定缓存的大小是64KB吗?我认为整个__constant内存空间是64KB。 (请参阅CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE) –

+0

你确实是对的,我错了。虽然总大小为64KB,但每个多处理器的缓存为8KB。我已更新我的答案以纠正此问题。 – mcd40