CUDA常量内存引用

4

我在常量内存中有一个数组(它是一个全局变量),并通过函数调用cudaGetSymbolAddress获取了对它的引用。当我使用这个引用来获取常量数据时,与使用全局变量相比,我的内核运行缓慢。这是什么原因呢?

__constant__ int g[2] = {1,2};
// __device__ int g[2] = {1,2};

// kernel: use by reference
__global__ void add_1( int *a, int *b, int *c, int *f )
{
    int tid = blockIdx.x * blockDim.x + threadIdx.x;
    c[tid] = f[0] * a[tid] + f[1] * b[tid];
}

// kernel: use global variable
__global__ void add_2( int *a, int *b, int *c, int *f )
{
    int tid = blockIdx.x * blockDim.x + threadIdx.x;
    c[tid] = g[0] * a[tid] + f[1] * b[tid];
}

int main()
{
    ......
    // a,b,c are large arrays in device memory of size 40960.

    int *f;
    cudaGetSymbolAddress( (void **)&f, (char *)&g);

    add_1 <<< 160, 256 >>> ( a, b, c, f );

    ......
}

这是示例代码,所有线程在warp中同时加载相同的位置。注释掉的代码是通过直接访问常量内存来实现的。

为什么不使用常量内存缓存的解释(by talonmies

原因是缺乏常量缓存。 只有当编译器在被明确标记为处于常量状态空间的变量上发出特定的PTX指令(ld.const)时,才会发生缓存访问。编译器知道如何做到这一点的方式是当一个变量被声明为__constant__时——它是一个静态的、编译时的属性,影响着代码生成。同样的过程不能在运行时发生。

如果你传递一个指针到全局内存中,并且编译器无法确定该指针是否在常量状态空间中,那么它就不会生成正确的PTX来通过常量缓存访问该内存。结果访问会变慢。

未解决的问题

为什么即使数组g被声明为__device__变量,当引用它时代码也会变慢。通过查看PTX代码,可以发现将全局内存加载到寄存器中:

  • 使用2个ld.global.s32指令,将4个字节加载到一个寄存器中。(在使用引用的代码中)
  • 使用1个ld.global.v2.s32指令,将8个字节加载到2个寄存器中。(在使用全局变量的代码中)

有什么区别,是否有任何文档参考?


我猜你没有利用常量特性。你如何访问全局和常量内存中的数据?提供一段代码片段将有助于我们给出更好的答案。 - pQB
pQB是正确的。我刚刚看到了talonmies的答案,根据给出的信息,无法确定哪个适用于您的问题。另外,您的GPU的计算能力是多少? - tera
我在代码中没有看到任何 __constant__ 声明。你如何调用内核? - tera
@tera 我已经修改了相关的代码。 - Chaitanya Turubati
谢谢。根据目前的代码,我相信我的答案是正确的。 :) - tera
显示剩余2条评论
1个回答

2

与全局内存不同,如果对常量内存的访问不是统一的(一个warp中的所有线程都访问相同的地址),则访问将被串行化(分成多个事务)。

因此,只有在访问可能是统一的情况下才使用常量内存。


我认为这不是非均匀访问,因为warp中的所有线程在load指令时请求相同的地址位置。 - Chaitanya Turubati
确实如此。我最初认为由[tid]索引的访问将是对常量内存的访问。您能否提供从cuobjdump -sass -fun add反汇编的内核代码,以便我们更好地了解正在发生的情况? - tera
你是否尝试过仅使用上述隔离代码而不包含程序的其余部分来检查问题是否仍然存在?问题可能与我们无法从这里看到的其他因素有关... - tera
我看不到代码的更新。查看PTX并不是很有帮助,因为那里的虚拟指令与机器指令不对应。ptxas将PTX翻译成机器码,并对其进行第二遍优化,因此实际的机器码可能看起来非常不同。 - tera
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/18225/discussion-between-t-srinivasa-chaitanya-and-tera - Chaitanya Turubati
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接