15
A
回答
40
通常情況下,如果一個塊向全局內存寫入某些內容,則不能保證其他塊會「看到」它。寫入全局內存的順序也不能保證,除了發佈它的塊之外。
有兩個例外:
- 原子操作 - 這些都是始終可見通過其它塊
- threadfence
可以想象,一個塊產生一些數據,然後使用原子操作來標記數據在那裏的標誌。但有可能,另一個塊會看到該標誌,但會讀取不正確或不完整的數據。
__threadfence
函數會暫停當前線程,直到它寫入全局內存時保證它可以被網格中的所有其他線程看到。所以,如果你這樣做:
- 存儲你的數據
__threadfence()
- 原子標記標誌
可以保證的是,如果其他塊看到標誌,它也將看到數據。
延伸閱讀:CUDA編程指南,章節B.2.4和B.5
相關問題
- 1. __threadfence意味着__syncthreads的效果?
- 2. CUDA線程和塊級別同步
- 3. CUDA-GDB:沒有CUDA設備
- 4. CUDA 5與CUDA 4兼容
- 5. 在CUDA編程中使用基於窗體的Cuda的Cuda
- 6. Nvidia Cuda計劃 - 我的Cuda適合Cuda架構嗎?
- 7. 對CUDA
- 8. 對CUDA
- 9. 與CUDA
- 10. 對CUDA
- 11. 與CUDA
- 12. 二維數組CUDA 2D紋理CUDA
- 13. 複製到CUDA到設備內存CUDA
- 14. cuda 8.0中'cuda-memcheck'的錯誤
- 15. CUDA找到最大值在給定的數組
- 16. 測試在CUDA
- 17. #define和CUDA
- 18. CUDA 4.0 vs 3.2
- 19. CUDA FFT異常
- 20. OpenMPI CUDA和CUDPP
- 21. CUDA hello world failed
- 22. Comparsion在CUDA
- 23. CUDA點積
- 24. Theano CUDA例外
- 25. CUDA頭文件
- 26. CUDA Dot產品
- 27. CUDA插件dlopen
- 28. 語法對CUDA
- 29. CUDA設置cudaError
- 30. CUDA爲maxwell
如何__syncthreads(),是否保證內存塊中的任何線程訪問將是可見的塊中的所有線程? – 2013-05-14 21:11:19
'__syncthreads()'強於'__threadfence_block()'。在'__syncthreads()'之後,你可以保證所有的共享/全局內存在屏障之前的所有線程都可見之前寫入。然而'__syncthreads()'只對一個塊有影響,並且在不同塊的線程之間沒有保證。 – CygnusX1 2013-05-14 22:12:52
來自其他SM的L1將與存儲的數據保持一致嗎?或者你是否仍然需要指定全局範圍加載(L1-non-cacheable)? – maxbc 2017-08-28 23:07:37