繁体   English   中英

比较和交换2D阵列

[英]Compare and Swap on a 2D Array

我正在尝试从不同的线程以原子方式写入2d数组(float ** W)。 但是,CAS始终会出现此错误:__sync_bool_compare_and_swap的参数1的类型不兼容

c = __sync_bool_compare_and_swap(&W[uu][i], a, b);

当我原子地写入1d数组时,它照常工作。

关于如何进行这项工作的任何想法? 我可以尝试在每个线程中创建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);
}

不会编译时给我与您编写的完全相同的消息。 这表明不支持浮点数:

英特尔文档中给出的定义仅允许使用int,long,long long类型以及它们的未签名对应类型。 GCC允许长度为1、2、4或8个字节的任何整数标量或指针类型。

看起来这证实了这一点。

如果您不使用钛合金,那么也许

四个非算术函数(加载,存储,交换和compare_exchange)也都具有通用版本。 此通用版本适用于任何数据类型。

您可能会使用__atomic_compare_exchange*因为根据文档,它们应适用于任何类型。 我还没有尝试过。

编辑:

main() {
  float* W = malloc(10);  
  float target;
  float val = 5.0f;
  __atomic_exchange(&W[4], &val, &target, __ATOMIC_RELAXED);
}

^-这至少可以编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM