我有 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字节的专用内存空间。它是专用的,因为它有一些特殊的功能,如缓存和广播。
常量内存空间驻留在设备内存中,并缓存在计算能力1.x和计算能力2.x中提到的常量缓存中。
见教派。 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));
你可以初始化pABC
例如,在 CPU 中循环或从文件加载数据,然后将数据复制到 GPU 的常量内存中。
请注意,我已调整您的示例以使用始终浮动。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)