【问题标题】:saving constant in CUDA on GPU在 GPU 上的 CUDA 中保存常量
【发布时间】:2015-02-21 10:55:40
【问题描述】:

如果我想做一个 for 循环,其中有一个基于 CUDA 代码的计算,并且有一堆我不想在每次执行代码时在 CPU 和 GPU 之间来回传输的常量,有什么我可以做的吗?

例如:

float* a, *b, *c;  // a, b, and c changes each time for loop is executed
int M, N;          // M and N get their value prior to the for loop, and 
                   // they do not change during the for loop

for (int n = 0; n < 100; n++)
{
    CUDAComputation(a,b,c,M,N);
} 

__global__ void CUDAComputation(double *a,
                                double *b,
                                double *c,
                                int M,
                                int N)
{
    // cuda-based code
}

我想我可以在.cu代码中声明全局变量,其中包括我的头文件,但是MN在全局内存中,谁访问CUDA应该很慢?或者我每次都必须cudamemcpy()MN到内核?谢谢。

【问题讨论】:

    标签: cuda


    【解决方案1】:

    M 和 N 是通过内核参数发送的整数。考虑到调用内核会产生一些开销,我不会担心此事务的速度,并且发送 2 个整数的额外开销不会很大。但是,您可以执行以下操作:

    __device__ int d_M, d_N;
    int h_M, h_N;
    
    __global__ void CUDAComputation(){ 
     //d_M and d_N are accessible in here
    }
    
    void runKernel(){
        h_M=25; h_N=24;
        cudaMemcpyToSymbol(d_N, &h_M, sizeof(int));
        cudaMemcpyToSymbol(d_M, &h_M, sizeof(int));
        myKernel<<<128, 128>>>();
    }
    

    如果您需要更大且不变的东西,您可以使用类似的东西:

    __device__ float* devPointer; float* ptr;
    cudaMalloc(&ptr, 256 * sizeof(float)); 
    cudaMemcpyToSymbol(devPointer, &ptr, sizeof(ptr));
    

    【讨论】:

    • 好的。谢谢。只是很直观,不需要重复发送每次都不会改变的东西。
    • 对不起,我包含的代码并不是我真正想要的。我已经更新了答案。如果现在看起来不错,请接受。
    • @Christian,每个cudaMemcpyToSymbol() 调用的开销与内核启动本身的开销大致相同。
    • 但是如果内核之间没有变化,你只需要做一次就可以忘记它。我建议将它留在内核调用中,因为我很懒,开销应该可以忽略不计,但这并不能真正回答我认为的问题,所以我包括了另一个选项。
    • @ChristianSarofeen 谢谢!
    猜你喜欢
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多