使用常量内存打印地址而不是cuda中的值

时间:2014-06-04 05:27:22

标签: cuda gpu-constant-memory

我试图在代码中使用常量内存,而不使用cudacopytosymbol从内核分配常量内存值。

 #include <iostream>
    using namespace std;
    #define N 10
    //__constant__ int constBuf_d[N];
    __constant__ int *constBuf;

__global__ void foo( int *results )
{
    int tdx = threadIdx.x;
    int idx = blockIdx.x * blockDim.x + tdx;


    if( idx < N )
    {
        constBuf[idx]=1;
         results[idx] = constBuf[idx];
    }
}

// main routine that executes on the host
int main(int argc, char* argv[])
{
    int *results_h = new int[N];
    int *results_d;


    cudaMalloc((void **)&results_d, N*sizeof(int));

    foo <<< 1, 10 >>> ( results_d );

    cudaMemcpy(results_h, results_d, N*sizeof(int), cudaMemcpyDeviceToHost);

    for( int i=0; i < N; ++i )
        printf("%i ", results_h[i] );
        delete(results_h);
}

输出显示

6231808 6226116 0 0 0 0 0 0 0 0 

我希望程序通过代码中的kenel打印分配给常量内存的值。

1 个答案:

答案 0 :(得分:1)

顾名思义,常量存储器对于设备代码是常量/只读的。你想要做的是非法的,不能让你工作。

要在常量内存中设置值,您目前有两种选择:

  1. 通过cudaMemcpyToSymbol API调用(或其等价物)
  2. 从主机代码设置值
  3. 在编译时使用静态初始化
  4. 在后一种情况下,这样的事情会起作用:

    __constant__ int constBuf[N] = { 16, 2, 77, 40, 12, 3, 5, 3, 6, 6 };
    
    __global__ void foo( int *results )
    {
        int tdx = threadIdx.x;
        int idx = blockIdx.x * blockDim.x + tdx;
    
    
        if( tdx < N )
        {
            results[idx] = constBuf[tdx]; // Note changes here!
        }
    }