在二维数组上进行比较和交换
Compare and Swap on a 2D Array
我正在尝试从不同线程以原子方式写入二维数组 (float**W)。但是 CAS 总是给出这个错误:__sync_bool_compare_and_swap
的参数 1 的类型不兼容
c = __sync_bool_compare_and_swap(&W[uu][i], a, b);
当我以原子方式写入一维数组时,它像往常一样工作正常。
关于如何使这项工作有任何想法吗?我可以尝试在每个线程中制作 1d 数组,然后在障碍后更新这个 2d 数组,但这会占用太多内存。我正在使用 Ubuntu/Linux.
谢谢。
main() {
int* W = malloc(10);
int uu = 1, i = 3;
__sync_val_compare_and_swap(&W[uu], 1, 2);
}
编译正常,但是:
main() {
float* W = malloc(10);
int uu = 1, i = 3;
__sync_val_compare_and_swap(&W[uu], 1.0f, 2.0f);
}
没有编译给我你写的完全相同的消息。这表明不支持浮动:
The definition given in the Intel documentation allows only for the
use of the types int, long, long long as well as their unsigned
counterparts. GCC will allow any integral scalar or pointer type that
is 1, 2, 4 or 8 bytes in length.
看起来这证实了这一点。
如果您不使用 itanium,那么也许
The four non-arithmetic functions (load, store, exchange, and
compare_exchange) all have a generic version as well. This generic
version works on any data type.
您可以使用 __atomic_compare_exchange*
,因为根据文档,这些应该适用于任何类型。不过我还没试过。
编辑:
main() {
float* W = malloc(10);
float target;
float val = 5.0f;
__atomic_exchange(&W[4], &val, &target, __ATOMIC_RELAXED);
}
^- 这至少编译。
我正在尝试从不同线程以原子方式写入二维数组 (float**W)。但是 CAS 总是给出这个错误:__sync_bool_compare_and_swap
的参数 1 的类型不兼容c = __sync_bool_compare_and_swap(&W[uu][i], a, b);
当我以原子方式写入一维数组时,它像往常一样工作正常。
关于如何使这项工作有任何想法吗?我可以尝试在每个线程中制作 1d 数组,然后在障碍后更新这个 2d 数组,但这会占用太多内存。我正在使用 Ubuntu/Linux.
谢谢。
main() {
int* W = malloc(10);
int uu = 1, i = 3;
__sync_val_compare_and_swap(&W[uu], 1, 2);
}
编译正常,但是:
main() {
float* W = malloc(10);
int uu = 1, i = 3;
__sync_val_compare_and_swap(&W[uu], 1.0f, 2.0f);
}
没有编译给我你写的完全相同的消息。这表明不支持浮动:
The definition given in the Intel documentation allows only for the use of the types int, long, long long as well as their unsigned counterparts. GCC will allow any integral scalar or pointer type that is 1, 2, 4 or 8 bytes in length.
看起来这证实了这一点。
如果您不使用 itanium,那么也许
The four non-arithmetic functions (load, store, exchange, and compare_exchange) all have a generic version as well. This generic version works on any data type.
您可以使用 __atomic_compare_exchange*
,因为根据文档,这些应该适用于任何类型。不过我还没试过。
编辑:
main() {
float* W = malloc(10);
float target;
float val = 5.0f;
__atomic_exchange(&W[4], &val, &target, __ATOMIC_RELAXED);
}
^- 这至少编译。