0
假设我有一个结构如下:复制阵列从主机到设备的CUDA
typedef struct values{
int one, int two, int three
} values;
现在,假设我在主机上创建值的阵列,并用随机数据
values vals*;
__device__ values* d_vals;
int main(){
vals = (values*)malloc(sizeof(values) * A_LARGE_NUMBER);
PopulateWithDate(); //populates vals with random data
}
填充
现在,我希望能够将值复制到设备上,这样我可以访问他们在我的内核像这样:
__global__ void myKernel(){
printf("%d", d_vals[0].one);//I don't really want to print, but whenever I try to access I get an error
}
Whate ver我尝试我得到一个非法的内存访问被遇到错误。
这是我当前的尝试:
int main(){
vals = (values*)malloc(sizeof(values) * A_LARGE_NUMBER);
PopulateWithDate(); //populates vals with random data
values* d_ptr;
cudaGetSymbolAddress((void**)&d_ptr, d_vals);
cudaMalloc((void**)&d_ptr, A_LARGE_NUMBER * sizeof(values));
cudaMemcpyToSymbol(d_ptr, &vals, sizeof(values) * A_LARGE_NUMBER);
cudaDeviceSynchronize();
dim3 blocksPerGrid(2, 2);
dim3 threadsPerBlock(16, 16);
myKernel<< <blocksPerGrid, threadsPerBlock >> >();
}
嗨。感谢您的有益回应。对不起,我的问题不太清楚。事情是我必须使用设备指针,因为myKernel不会从main调用。相反,它会在我从外部代码收到一个随机事件后被调用。换句话说,我将无法将d_ptr作为参数传递给内核,我必须在某处保留对其的引用 – William
确定这些更改相对较小,因此我添加了一个演示变化的示例。 –