如何为初学者使用恒定内存(Cuda C)

Fed*_*ile 3 c memory cuda constants

我有3倍恒定的值(ABC),我想在恒定存储器保存; 我通过键入以下代码找到了一种方法:

// 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));
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是我认为这不是最好的处理方法,因为如果我有更多的常量,它将变得非常不便。

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

pQB*_*pQB 6

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

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

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

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

__constant__ float c_ABC[3]; // 3 elements of type float (12 bytes)
Run Code Online (Sandbox Code Playgroud)

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

float pABC[] = {1, 2, 3};
...
cudaMemcpyToSymbol(c_ABC, &pABC, 3 * sizeof(float));
Run Code Online (Sandbox Code Playgroud)

您可以pABC在CPU中进行初始化(例如,循环执行)或从文件中加载数据,然后将数据复制到GPU的恒定内存中。

注意,我已经调整了您的示例以始终使用浮点数。