Fed*_*ile 3 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));
cudaMemcpyToSymbol(B, &pB, sizeof(B));
cudaMemcpyToSymbol(C, &pC, sizeof(C));
...
}
Run Code Online (Sandbox Code Playgroud)
但是我认为这不是最好的处理方法,因为如果我有更多的常量,它将变得非常不便。
这是我的问题:如何复制上面编写的代码行以获得更紧凑的形式?
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的恒定内存中。
注意,我已经调整了您的示例以始终使用浮点数。