如何为初学者使用常量内存(Cuda C)

8

我有3个常量 (A,B,C),我希望将它们保存在常量内存中。我想出了一种方法,通过输入以下代码来实现:

// CUDA global constants
__constant__ int A;
__constant__ int B;
__constant__ int C;

int main(void)
{

    float pA=1;
    float pB=2;
    float pC=3;
    ...
    cudaMemcpyToSymbol(A, &pA, sizeof(A));
    cudaMemcpyToSymbol(B, &pB, sizeof(B));
    cudaMemcpyToSymbol(C, &pC, sizeof(C));
    ...
}

然而,我认为这不是最好的解决方案,因为如果我有更多的常数,那么这样做将变得非常不便。

我的问题是:如何复制我上面写的代码行以获得更紧凑的形式?


使用const结构体、数组或将变量包含在内核调用中。 - Christian Sarofeen
1个回答

14

CUDA中的常量内存是一个专用的内存空间,大小为65536字节。它是专用的,因为具有一些特殊功能,如缓存和广播。

常量内存空间位于设备内存中,并且在计算能力1.x和计算能力2.x中被缓存在常量缓存中。

有关详细信息,请参见 CUDA C 编程指南的第5.3.2节“设备内存访问”和第G.4.4节“常量内存”。

因此,您可以像已经做过的那样为一个元素分配常量内存,也可以为元素数组分配内存。

__constant__ float c_ABC[3]; // 3 elements of type float (12 bytes)

然而,在CUDA中不允许动态分配常量内存。因此,您必须像处理单个元素那样将数据从CPU复制到GPU。

float pABC[] = {1, 2, 3};
...
cudaMemcpyToSymbol(c_ABC, &pABC, 3 * sizeof(float));
你可以在CPU上初始化pABC,例如在循环中或从文件加载数据,然后将数据复制到GPU的常量内存中。
请注意,我已经调整了你的示例,始终使用浮点数。

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