Используя постоянную память печатает адрес вместо значения в 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 ответ
Решение
Постоянная память, как следует из названия, является постоянной / только для чтения по отношению к коду устройства. То, что вы пытаетесь сделать, является незаконным, и его нельзя заставить работать.
Чтобы установить значения в постоянной памяти, у вас есть два варианта:
- установить значение из кода хоста через
cudaMemcpyToSymbol
Вызов API (или его эквиваленты) - использовать статическую инициализацию во время компиляции
В последнем случае что-то вроде этого будет работать:
__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!
}
}