考虑OpenCL中的以下代码:
void set_vals(__global int* mem) {
mem[0] = 1;
mem[1] = 2;
}
void get_vals(__global int* mem) {
int x = mem[0];
int y = mem[1];
printf("%d %d\n", x, y);
}
假设内存开始全部为零,并且两个工作项并行运行set_vals
和get_vals
,那么可能要打印的值是什么?显然,0 0
和1 2
是可能的,但1 0
和0 2
也可能吗?还要注意以下代码:
void set_vals(__global int2* mem) {
mem[0] = (int2)(1, 2);
}
void get_vals(__global int2* mem) {
int2 a = mem[0];
printf("%d %d\n", a.x, a.y);
}
那种情况怎么样:1 0
和0 2
是可能的,还是矢量写入原子?