N 個のスレッドを (1 つのブロックで) 起動する必要がある
これはコードです。'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;
}
デバイスコード:
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 自体でさらに値を確認することはできません。
どうすれば解決できますか?それとももっと良い方法がありますか?