是否有可能使cuda使用在函數外聲明的單線程作用域變量(寄存器或本地內存)?Cuda單線程作用域變量
我的大部分設備功能需要使用相同的變量。
我不想將與變量相同的變量作爲參數傳遞給我的所有設備函數,我想在函數之外聲明變量。
這可能嗎?
我的計算能力是1.2。
編輯:一個例子:
__device__ __local__ int id;
__device__ __local__ int variable1 = 3;
__device__ __local__ int variable2 = 5;
__device__ __local__ int variable3 = 8;
__device__ __local__ int variable4 = 8;
//
__device__ int deviceFunction3() {
variable1 += 8;
variable4 += 7;
variable2 += 1;
variable3 += id;
return variable1 + variable2 + variable3;
}
__device__ int deviceFunction2() {
variable3 += 8;
variable1 += deviceFunction3();
variable4 += deviceFunction3();
return variable3 + variable4;
}
__device__ int deviceFunction1() {
variable1 += id;
variable4 += 2;
variable2 += deviceFunction2();
variable3 += variable2 + variable4;
return variable1 + variable2 + variable3 + variable4;
}
// Kernel
__global__ void kernel(int *dev_a, int *dev_b, int *dev_c) {
id = get_id();
dev_c[id] = deviceFunction1();
}
3個設備功能需要操縱相同的變量。每個變量都依賴於每個線程計算。據我的理解,我不能使用上面的代碼,因爲我不能聲明變量,以便它們對於每個線程都是本地的。
我必須做的,而不是正在申報核函數中的所有變量,然後將指針傳遞給變量的所有其他功能:
__device__ int deviceFunction3(int* id,int* variable1,int* variable2,int* variable3,int* variable4) {
*variable1 += 8;
*variable4 += 7;
*variable2 += 1;
*variable3 += 2;
return *variable1 + *variable2 + *variable3;
}
__device__ int deviceFunction2(int* id,int* variable1,int* variable2,int* variable3,int* variable4) {
*variable3 += 8;
*variable1 += deviceFunction3(id,variable1,variable2,variable3,variable4);
*variable4 += deviceFunction3(id,variable1,variable2,variable3,variable4);
return *variable3 + *variable4;
}
__device__ int deviceFunction1(int* id,int* variable1,int* variable2,int* variable3,int* variable4) {
*variable1 += *id;
*variable4 += 2;
*variable2 += deviceFunction2(id,variable1,variable2,variable3,variable4);
*variable3 += *variable2 + *variable4;
return *variable1 + *variable2 + *variable3 + *variable4;
}
// Kernel
__global__ void kernel(int *dev_a, int *dev_b, int *dev_c) {
int id = get_id();
int variable1 = 3;
int variable2 = 5;
int variable3 = 8;
int variable4 = 8;
dev_c[id] = deviceFunction1(&id,&variable1,&variable2,&variable3,&variable4);
}
你能否給你的問題添加一個用例的例子?包含變量和\ _ \ _ device \ _ \ _函數的類是否工作? – talonmies 2013-03-10 15:22:43
如果有'__device__'知道它屬於哪個線程的方式,但我不認爲有這樣的事情。 (即使它不能訪問寄存器,但它可以訪問全局定義的數組作爲每個線程的本地變量,即使如此,性能也會降低很多!) – 2013-03-10 15:59:29
沒有辦法讓一個線程CUDA中文件範圍的私有變量。特別是,我不相信有辦法在PTX中支持它。 – 2013-03-11 09:38:09