如何为初学者使用恒定记忆(Cuda C)

如何为初学者使用恒定记忆(Cuda C),c,memory,cuda,constants,C,Memory,Cuda,Constants,我有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))

我有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));
    ...
}
然而,我相信这不是最好的方法,因为如果我有更多的常数,这将变得非常不方便


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

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

常量内存空间驻留在设备内存中,并缓存在Compute Capability 1.x和Compute Capability 2.x中提到的常量缓存中

见A节。5.3.2. 设备内存访问和分区。G.4.4。有关更多详细信息,请参阅CUDA C编程指南中的常量内存

所以,您可以像以前一样为一个元素分配常量内存,也可以为一个元素数组分配内存

__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的恒定内存中


请注意,我已将您的示例调整为使用始终浮点。

使用常量结构、数组或在内核调用中包含变量。