花一些時間專注於NVIDIA提供的豐富文檔。
從編程指南:
float* devPtr;
cudaMalloc((void**)&devPtr, 256 * sizeof(*devPtr));
cudaMemset(devPtr, 0, 256 * sizeof(*devPtr));
這是一個如何分配內存簡單的例子。現在,在你的內核,你應該接受一個指向浮動,像這樣:
__global__
void kernel1(float *some_neat_data)
{
some_neat_data[threadIdx.x]++;
}
__global__
void kernel2(float *potentially_that_same_neat_data)
{
potentially_that_same_neat_data[threadIdx.x] *= 0.3f;
}
所以現在你可以調用它們像這樣:
float* devPtr;
cudaMalloc((void**)&devPtr, 256 * sizeof(*devPtr));
cudaMemset(devPtr, 0, 256 * sizeof(*devPtr));
kernel1<<<1,128>>>(devPtr);
kernel2<<<1,128>>>(devPtr);
由於這些數據在衆多 使用功能,我想它是全球性的 。
使用全局變量的原因很少。這絕對不是一個。我將把它作爲一個練習來擴展這個例子,包括將「devPtr」移動到全局範圍。
編輯:
好,最根本的問題是這樣的:你的內核只能接入設備內存以及他們能夠使用的唯一的全球範圍的指針是GPU的。當從CPU調用內核時,幕後會發生什麼,指針和原語在內核執行之前被複制到GPU寄存器和/或共享內存中。
所以我可以建議的最接近的是:使用cudaMemcpyToSymbol()來實現你的目標。但是,在背景中,考慮一種不同的方法可能是正確的。
#include <algorithm>
__constant__ float devPtr[1024];
__global__
void kernel1(float *some_neat_data)
{
some_neat_data[threadIdx.x] = devPtr[0] * devPtr[1];
}
__global__
void kernel2(float *potentially_that_same_neat_data)
{
potentially_that_same_neat_data[threadIdx.x] *= devPtr[2];
}
int main(int argc, char *argv[])
{
float some_data[256];
for (int i = 0; i < sizeof(some_data)/sizeof(some_data[0]); i++)
{
some_data[i] = i * 2;
}
cudaMemcpyToSymbol(devPtr, some_data, std::min(sizeof(some_data), sizeof(devPtr)));
float* otherDevPtr;
cudaMalloc((void**)&otherDevPtr, 256 * sizeof(*otherDevPtr));
cudaMemset(otherDevPtr, 0, 256 * sizeof(*otherDevPtr));
kernel1<<<1,128>>>(otherDevPtr);
kernel2<<<1,128>>>(otherDevPtr);
return 0;
}
對於這個例子,不要忘記'--host-compilation = C++'。
看看也使用共享內存,global是設備內存層中最慢的。 – SpaceghostAli 2008-10-17 19:01:55
爲什麼要使用全局變量而不是將設備指針作爲參數傳遞給內核?這樣做只會給你在CPU代碼中使用全局內存時的所有限制,幾乎沒有什麼優勢。 – 2012-04-26 23:07:16