我在opencl中使用变量union(private)来获得奇怪的行为。代码:使用Union内部寄存器的奇怪行为OpenCL
v = { 0, 1, 2, ... } // Defined in host and load to Device
typedef union svec8{
int word[8];
int8 word8;
} vec8;
__kernel
void red(global vec8 *v, global int *out){
uint sizeBin = 8;
vec8 binning = {0}; // Every Thread has a 8-space bin, initialized with 0
uint gID = get_global_id(0);
int temp;
binning.word8 = v[ dID ].word8;
#ifdef CONDITION
temp = 0;
for (uint i = 0; i < sizeBin; i++){
temp += binning.word[ i ];
}
#endif
if (dID == 0){
*out = binning.word[n]; // n belongs to [0, 7]
}
}
的问题是,每n是一个选择,条件被定义时,*总分总是等于1,但如果我未定义条件,*总分得到正确的值,即0 ,1,..,或7,当然取决于哪个ni选择。
我还注意到,如果我停止使用union并只使用int8,它就解决了这个问题。
由于提前,
平台:Ubuntu的12.04 - 3.2.0-24 - 仿制PAE - 驱动程序的OpenCL 1.2 AMD-APP(923.1)
能人(不管是谁)解释这个问题的downvotes? – eudoxos
我想有人不喜欢我!大声笑 – Caslu