我试图在代码中使用常量内存,而不使用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打印分配给常量内存的值。
答案 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!
}
}