2012-07-17 34 views
-2

我需要啓動N個線程(在一個塊中)哪種方法可以檢查Cuda中的位陣列?

這是代碼,'e'是1024b上的bignumber。我需要將它複製到gpu上並一點一點地讀取它。

主機代碼:

unsigned char *__e; 
BIGNUM *e = BN_new(); 
unsigned char exp[128]; 

//  e 
i = cudaMalloc((void**)&__e, 128* sizeof(unsigned char)); 
if(i != cudaSuccess) 
    printf("cudaMalloc __e FAIL! Code: %d\n", i); 

BN_bn2bin128B(e, exp); // copy data in exp 

for(i=0; i<128; i++) 
    exp[i] = reverse(exp[i]); 

i = cudaMemcpy(__e, exp, 128* sizeof(unsigned char), cudaMemcpyHostToDevice); 
if(i != cudaSuccess) 
    printf("cudaMemcpy __e FAIL! Code: %d\n", i); 


unsigned char reverse(unsigned char b) { 
b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; 
b = (b & 0xCC) >> 2 | (b & 0x33) << 2; 
b = (b & 0xAA) >> 1 | (b & 0x55) << 1; 
return b; 
} 

設備代碼:

for(int i=0; i<1024; i++) 
    if(ISBITSET(__e, i) == 1) 
     //do something 

頁眉:

#define ISBITSET(x,i) ((x[i>>3] & (1<<(i&7)))!=0) 

不幸的是ISBITSET犯規接受任何來自__e不同,所以我不能在檢查其它值__e本身

我該如何解決它?或者,還有更好的方法?

+2

也許你應該放下你最初的嘗試和你碰到的障礙。 – 2012-07-17 19:32:07

+0

-1您需要在這個問題上多加一點努力。你對你想要做的描述是不明確的和不完整的。你有什麼嘗試?您在CUDA實施中期待的問題是什麼?也許還需要添加一些僞代碼。 – 2012-07-17 19:59:39

回答

2

的GPU是一個32位的機器,所以你要在同一時間所以處理您的1024位32位,而不是8,你應該更換所有unsigned charunsigned int並相應地調整值。

GPU有一個快速的PTX指令可以一次反轉32位,所以你可能想在GPU上實現它。該指令被稱爲brev。要使用它,你會增加內嵌PTX,像這樣(未經):

asm("brev.b32 %0, %1;" : "=r"(dst_var) : "r"(src_var)); 

欲瞭解更多信息,請參閱NVIDIA的文件,「使用行內PTX大會CUDA」。

for(int i=0; i<1024; i++) 
    if(ISBITSET(__e, i) == 1) 
     //do something 

此代碼可能有性能問題。假設有一半的可能性,你只有50%的可能性能,因爲你的一半線程將不得不等待,而另一半線程執行//do something。我想不出一個解決方法。您可能還想要啓動線程而不是循環。

不幸的是ISBITSET犯規接受任何來自__e不同,所以我不能在__e本身

你能詳細檢查其它值? ISBITSET宏對我來說看起來好像看起來像它可以處理任何數組的無符號字符,這就是__e

+0

對於brev,有一些代碼會很高興,但你也可以簡單地給我一個關於它的好鏈接。對於cicle:你能更好地解釋你的性能問題是什麼意思嗎?因爲所有的線程都經過它。對於這個錯誤,當我試圖用&__ e [i]編譯時,ISBITSET返回了一個錯誤,它正在抱怨所請求的指向對象的指針。經過多次嘗試,我通過添加一個括號來解決...所以如下所示:(&__ e [i]),並且它發生了...... – elect 2012-07-21 17:16:04

+0

我爲'brev'添加了一個示例。關於ISBITSET,似乎你發現了預處理宏的樂趣之一。潛在的性能問題不在ISBITSET宏中,而在'if'條件中。如果'if'在warp中的32個線程中的一半評估爲'true',則另一半線程在'//做些事情'運行時被禁用。如果內核中的所有時間都是「做某事」的話,那麼內核只能在其潛在性能的一半上運行。 – 2012-07-22 03:26:36

相關問題