[英]Is there a DPC++/SYCL equivalent of CUDA's atomicCAS?
據我了解,CUDA的atomicCAS
有如下定義(這是四個之一)
int atomicCAS(int* address, int compare, int val);
並將全局共享內存中位於address
(在文檔old
中命名)的值與compare
進行原子比較,如果相等,則將值分配給val
,否則什么也不做。 在這兩種情況下都返回old
。
查看 SYCL API,我只能找到compare_exchange_strong
,不幸的是,它沒有做我想要的,使用與上面相同的命名,它比較old
與compare
,如果不成功,則改變compare
(通過引用傳遞)。
正如 Peter Cordes 在評論中指出的那樣, sycl::compare_exchange_strong
是正確的選擇。 從 SYCL 2020 rev. 4 compare_exchange_strong
的描述:
以原子方式將此
atomic_ref
引用的對象的值與expected
的值進行比較。 如果值相等,則將引用對象的值替換為desired
的值; 否則將被引用對象的原始值賦給expected
。
所以,
int old = compare;
ref.compare_exchange_strong(old, val);
是,就更新ref
而言,相當於
old = atomicCAS(address, compare, val);
如果你有興趣,你可以親自看看 hipSYCL 是如何實現sycl::compare_exchange_strong
的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.