【问题标题】:How to use constant memory for beginners (Cuda C)如何为初学者使用常量内存(Cuda C)
【发布时间】:2015-05-13 07:03:52
【问题描述】:

我有 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 结构、数组或包含变量。

标签: c memory cuda constants


【解决方案1】:

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)

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

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

您可以在 CPU 中初始化pABC,例如在循环中或从文件中加载数据,然后将数据复制到 GPU 的常量内存中。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    相关资源
    最近更新 更多