数量は、サイズごとに揃えるのが好きです。cudaがあなたがしていることをどのように処理するかはわかりませんが、それは環境固有である可能性がありますが、次のものを使用しています:
*((unsigned long long int *) &arr[3])
8 バイト アラインされていると仮定するとarr
、4 バイト アラインされている 8 バイト量を取得しています。もちろん、これは次の理由で発生します。
arr = 8n // n is an integer
sizeof(int) = 4
&arr[3] = 8n + 3*4 // simplifies to 8(n+1) + 4
32 ビットと 16 ビットの整数を使用してプロセッサで同じことをしようとすると、問題が発生することはわかっています (ただし、64 ビットと 32 ビットの整数で試したことはありません)。
アクセスしようとしているデータがどこにあるかを把握するために、ある種のアクセサー取引を自作する必要があります。あなたの状況に似た、次の状況を考えてみましょう。
int get32BitValueFrom(unsigned long long int longArray[], int index)
{
// get the 64 bit int containing the 32 bit int we want
unsigned long long int value = longarray[index >> 1];
// if we wanted an odd index, return the high order 32 bits
// otherwise return the low order 32 bits
return (int) ((index & 1) ? (value >> 32) : (value));
}
編集:あなたがcudaを使用していることは知っていますし、分岐を避けることも知っていますが、同じことを達成する何らかのビット単位または数学的トリックを使用して同等のコードを書く方法があると確信しています。