数量喜欢按大小排列。我不确定 cuda 如何处理你正在做的事情以及它可能是特定于环境的,但是你使用:
*((unsigned long long int *) &arr[3])
假设arr
是 8 字节对齐,则采用 8 字节数量,即只有 4 字节对齐。这当然是因为:
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,并且我知道要避免分支,但我确信有一种方法可以使用某种按位或数学技巧来编写等效代码来完成相同的事情。