Pointers CUDA支持指针别名吗?

Pointers CUDA支持指针别名吗?,pointers,cuda,nvidia,aliasing,Pointers,Cuda,Nvidia,Aliasing,我之所以问这个问题,是因为我的代码中存在一些奇怪的错误,我怀疑这可能是某种别名问题: __shared__ float x[32]; __shared__ unsigned int xsum[32]; int idx=threadIdx.x; unsigned char * xchar=(unsigned char *)x; //...do something if (threadIdx.x<32) { xchar[4*idx]&=somestring[0];

我之所以问这个问题,是因为我的代码中存在一些奇怪的错误,我怀疑这可能是某种别名问题:

__shared__ float x[32];
__shared__ unsigned int xsum[32];

int idx=threadIdx.x;
unsigned char * xchar=(unsigned char *)x;
//...do something
 if (threadIdx.x<32)
 {
    xchar[4*idx]&=somestring[0];
    xchar[4*idx+1]&=somestring[1];
    xchar[4*idx+2]&=somestring[2];
    xchar[4*idx+3]&=somestring[3];

    xsum[idx]+=*((unsigned int *)(x+idx));//<-Looks like the compiler sometimes fail to recongize this as the aliasing of xchar;
 };
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuux[32];
__共享的无符号整数xsum[32];
int idx=threadIdx.x;
无符号字符*xchar=(无符号字符*)x;
//…做点什么

if(threadIdx.x我认为这里有一个争用条件。但我不知道什么是
somestring
。如果所有线程都是相同的,那么可以这样做:

__shared__ float x[32];

unsigned char * xchar=(unsigned char *)x;

//...do something

if(threadIdx.x<4) {
     xchar[threadIdx.x]&=somestring[threadIdx.x];
}

__syncthreads();

unsigned int xsum+=*((unsigned int *)x);
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuux[32];
无符号字符*xchar=(无符号字符*)x;
//…做点什么

如果(threadIdx.x编译器只需要在兼容类型之间使用别名。由于
char
float
不兼容,编译器可以自由假设指针从不使用别名


如果你想对浮点进行位运算,首先(通过
\uuuu float\u as\u int()
)转换为无符号整数,然后对其进行运算,最后再转换回浮点(使用
\uuuu int\u as\u float()
)。

你为什么不把
\uuu shared\uuu
放在
无符号字符*xchar
前面?对于
来说也是一样的事情(无符号整数*)x
@thejh我需要在这里这样做吗?不确定,但我想是的。你可以试试看它是否能让你的代码工作…@thejh我认为把
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu共享
放在共享内存中不会改变任何事情,因为内存已经在共享内存中分配了。xchar只是这个内存上的一个指针。我认为这里有一个正在同一内存上写入。因此,当执行
xsum+=…
时,您不知道有多少线程完成了前面的操作。如果将
volatile
关键字放在
x[]
*xchar
的定义前面,如果内核实际上以
xsum[id]结尾,会发生什么情况+=…
line,那么您还有其他问题。我假设之后还有其他代码。很抱歉,示例代码有误导性,我只是想在这个示例中保存几行代码,在我的原始代码中,没有竞争条件。@user0002128好的,所以我想您应该在运行时分配内存,否则它只能工作对于32个线程的块。有一点我不明白。在编程指南p.85中,它们声明
array0
,并在
array
的内存中指向不同的类型。这里有别名,对吗?如果在修改
array0
后使用
array0
我应该得到修改后的值?这将是未定义的。在中,它隐式地假定从不访问
数组
。它只用于为备份
数组0
数组1
数组2
分配内存。