Используя постоянную память печатает адрес вместо значения в cuda

Я пытаюсь использовать постоянную память в коде с постоянным значением памяти из ядра, не используя 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 

Я хочу, чтобы программа выводила значение, присвоенное постоянной памяти, через кенель в коде.

1 ответ

Решение

Постоянная память, как следует из названия, является постоянной / только для чтения по отношению к коду устройства. То, что вы пытаетесь сделать, является незаконным, и его нельзя заставить работать.

Чтобы установить значения в постоянной памяти, у вас есть два варианта:

  1. установить значение из кода хоста через cudaMemcpyToSymbol Вызов API (или его эквиваленты)
  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!
    }
}
Другие вопросы по тегам