在Cuda中检查位数组的最佳方法是什么?

在Cuda中检查位数组的最佳方法是什么?,cuda,bit-manipulation,bit,Cuda,Bit Manipulation,Bit,我需要启动N个线程(在一个块中) 这是代码,“e”是1024b上的一个大数字。我需要把它复制到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("cudaMallo

我需要启动N个线程(在一个块中)

这是代码,“e”是1024b上的一个大数字。我需要把它复制到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;
}
无符号字符*;
BIGNUM*e=BN_new();
无符号字符exp[128];
//e
i=cudamaloc((void**)和u_e,128*sizeof(unsigned char));
如果(i!=cudaSuccess)
printf(“cudamaloc失败!代码:%d\n”,i);
BN_bn2bin128B(e,exp);//在exp中复制数据

对于(i=0;i>4 |(b&0x0F)>2 |(b&0x33)>1 |(b&0x55)3]&(1GPU是一台32位机器,因此您希望一次处理1024位32位,而不是8位。因此,您应该用
unsigned int
替换所有的
unsigned char
,并相应地调整值

GPU有一个快速PTX指令,用于一次反转32位,因此您可能希望在GPU上实现该指令。该指令称为
brev
。要使用它,您需要添加内联PTX,类似以下内容(未测试):

有关更多信息,请参阅NVIDIA的文档“在CUDA中使用内联PTX组件”


用于(int i=0;i可能你应该放下你最初的尝试和遇到的障碍。-1你需要在你的问题上投入更多的精力。你对你正在尝试做的事情的描述是模糊和不完整的。你尝试了什么?你在CUDA实现中预期的问题是什么?也许还需要添加some伪代码。对于brev,最好有一些代码,但你也可以简单地给我一个关于它的好链接。对于For cicle:你能更好地解释一下性能问题是什么意思吗?因为所有的线程都会遇到这个问题。对于这个错误,当我试图用&\u e[I]编译时,ISBITSET返回了一个错误,它抱怨请求指向对象的指针。经过多次尝试后,我通过添加括号解决了此问题…如下所示:(&u e[I])我为
brev
添加了一个例子。关于ISBITSET,你似乎发现了预处理器宏的乐趣之一。潜在的性能问题不在ISBITSET宏中,而是在
if
条件中。如果扭曲中32个线程的一半的
if
计算结果为
true
,则另一半的当运行
//do something
时,e线程被禁用。如果
//do something
占用内核中的所有时间,内核将仅以其潜在性能的一半运行。
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)
asm("brev.b32 %0, %1;" : "=r"(dst_var) : "r"(src_var));
for(int i=0; i<1024; i++)
    if(ISBITSET(__e, i) == 1)
        //do something