簡體   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