2012-07-17 65 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

相关问题