考慮一對讀取和寫入相同內存位置的OpenCL內核。作爲一個簡單的例子,請考慮以下的OpenCL程序:在OpenCL內核中可以讀寫競爭條件是否導致數據損壞?
__kernel void k1(__global int * a)
{
a[0] = 2*a[1];
}
__kernel void k2(__global int * a)
{
a[1] = a[0]-1;
}
如果許多線程啓動,運行諸多每個內核中,所產生的全局存儲器的狀態是不確定性。
這仍然可能允許編寫接受任何可能的內核操作順序的異步算法。
但是,這要求對全局GPU內存的讀寫是原子。
我的問題是
- 是這個保證是真的在任何當前GPGPU的硬件?
- 如果這被OpenCL標準視爲未定義行爲?如果是這樣,那麼常見的實現(特別是CUDA工具包中包含的)會做什麼?
- 如何測試這種擔憂?
爲什麼你有兩個同名的內核?無論如何,內存讀取不是原子的。 – 2015-03-19 12:47:50
謝謝,錯字固定。你能更精確嗎? 「內存讀取不是原子」是什麼意思? OpenCL標準不保證它們是原子的嗎?他們在任何現有的硬件上都不是原子的?你能指出某種參考嗎? – 2015-03-19 14:19:22