Nvidia GPU上OpenCL本地内存的内存组织

时间:2017-09-12 00:16:26

标签: opencl gpu nvidia

我正在尝试使用本地内存优化我的OpenCL内核,特别是在Nvidia GPU上使用。我读到了warp以及它们如何有效地访问本地存储库以及银行冲突如何发生。我找不到的一个例子是如何为这个内存分配多个本地内存声明。

例如在这个OpenCL内核中:

__kernel void computeExample(__global float* input,
                             __global float* output,
                             __local float* multiplier,
                             __local float* offsets)
{
    uint localId = get_local_id(0);

    multiplier[localId] = localId * 2.0f;
    offsets[localId] = localId + 2.0f;

    // compute something here
}

这只是为了说明,但我想知道的是当我声明两个或更多本地内存变量时,它们如何在内存中专门组织在nvidia卡上。它们是端到端分配的,所以它们是从前一个开始的吗?或者每个局部变量从第一个存储体开始,在变量之间留下可能的填充,但是从128字节边界开始(32个存储体×每个存储体4个字节)。内核中的声明顺序也确定它们驻留在内存中的顺序吗?

我想要的是优化我的本地内存大小,以避免银行冲突,并尽可能利用合并访问。

我知道这可能因设备而异,甚至可能在不同的nvidia GPU上有所不同,因此无法保证,但有关组织本地数据的最佳方式的任何想法或提示都将是有用的信息。

谢谢 斯科特

0 个答案:

没有答案