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
確定這些更改相對較小,因此我添加了一個演示變化的示例。 –