當我們在一般的C/C++ CUDA代碼,例如編寫內聯PTX彙編:當使用內聯PTX asm()指令時,'volatile'會做什麼?
__device__ __inline__ uint32_t bfind(uint32_t val)
{
uint32_t ret;
asm ("bfind.u32 %0, %1;" : "=r"(ret): "r"(val));
return ret;
}
我們可以asm
後添加volatile
關鍵字,例如:
__device__ __inline__ uint32_t bfind(uint32_t val)
{
uint32_t ret;
asm volatile ("bfind.u32 %0, %1;" : "=r"(ret): "r"(val));
return ret;
}
的CUDA documentation on inline PTX assembly說:
編譯器假定一個
asm()
語句沒有副作用,除了改變輸出操作數。爲確保在生成PTX期間不刪除或移動asm
,應使用volatile關鍵字
我不明白這意味着什麼。所以,
- 爲什麼我的
asm()
被刪除?或者說,如果編譯器發現它沒有效果,爲什麼我應該介意它被刪除? - 爲什麼在PTX生成期間我的
asm()
被移動,這是一個問題?這是優化過程的一部分,不是嗎? - 如何在分別面對非易失性和易失性指令時更準確地表徵編譯器的行爲?