OpenCLでIsing Modelのシミュレーションを構築しています。これは、データが/ 1または/ -1。OpenCL - バイトを8要素のベクトルに分割する最も効率的な方法
メモリ帯域幅を節約するために、これらの状態の8つが1バイト(1 = 0、1 = 0)にエンコードされます。計算の1つでは、元の状態、すなわち1または-1に対応する値を持つ整数ベクトルが必要です。
例:
入力バイト(OpenCLの中UCHAR):01010011
変換するには:(int8)(-1,1,-1,1,-1,-1,1,1);
私はその問題のための実用的なソリューションを持っているが、より速く、より効率的があれば、私は思ったんだけど方法:
uchar c = spins[id];
int8 spin;
spin.s0 = (c >> 0) & 1;
spin.s1 = (c >> 1) & 1;
spin.s2 = (c >> 2) & 1;
spin.s3 = (c >> 3) & 1;
spin.s4 = (c >> 4) & 1;
spin.s5 = (c >> 5) & 1;
spin.s6 = (c >> 6) & 1;
spin.s7 = (c >> 7) & 1;
spin = spin * 2 - 1;
EDIT:
が速く私の状況ではしていないようですが、それはのLEAでより簡潔ですt:
__constant uchar8 bits = (uchar8)(0,1,2,3,4,5,6,7);
uchar c = spins[id];
int8 spin = convert_int8((uchar8)(c) >> bits & 1) * 2 - 1;
これはすでに非常にうまくいっているようですが、なぜもっと複雑なものに行くのですか? 'int8 spin =((int8)(c)>>(int8)(0,1,2,3,4,5,6,7)&1)* 2 - 1;' – DarkZeros