-2

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 

プログラムで、コード内のケネルを介して定数メモリに割り当てられた値を出力する必要があります。

4

1 に答える 1

1

定数メモリは、名前が示すように、デバイス コードに関して定数/読み取り専用です。あなたがやろうとしていることは違法であり、機能させることはできません。

定数メモリに値を設定するには、現在、次の 2 つの選択肢があります。

  1. cudaMemcpyToSymbolAPI呼び出し(または同等のもの)を介してホストコードから値を設定します
  2. コンパイル時に静的初期化を使用する

後者の場合、次のようなものが機能します。

__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!
    }
}
于 2014-06-04T07:27:57.453 に答える