在下一個 CUDA 主要版本 CUDA 13.0 中,NVIDIA 將對NVIDIA CUDA 編譯器驅動程式 (NVCC)__global__
引入兩項重大變化,這將影響 ELF 可見性和函數和裝置變數的連結。這些更新旨在防止長期以來難以檢測和調試的細微運行時錯誤。但是,這些變更可能會影響一些現有的 CUDA C++ 程式。
這篇文章旨在提醒用戶注意潛在的中斷,解釋更改背後的原因,並提供可以恢復舊行為的 NVCC 標誌的指導。表 1 總結了這兩項變更。
特徵 | ELF 可見性 | 強制內部連結 |
功能 詳情 | 強制隱藏 __global__ 函數、__managed__/__device__/__constant__ 變數的ELF 可見性 | 強制__global__ 函數宿主模板存根定義具有內部連結(僅限整個程式模式) |
受影響的平台 | 非 Windows 上的共用程式庫 | 所有平台均採用NVCC全程式編譯模式(-rdc=false )。這是預設的 NVCC 模式。 |
用戶影響 | __global__ 預設情況下,函數、__managed__/__device__/__shared__ 變數不會從共享庫匯出 | 對另一個翻譯單元中的模板實例的引用__global__ 將無法建置。 |
控制標誌(CUDA 12.8+) | -device-entity-has-hidden-visibility={true|false} CUDA 13.0+ 中的預設值:true CUDA <13.0 中的預設值:false | -static-global-template-stub={true|false} CUDA 13.0+ 中的預設值:true CUDA <13.0 中的預設值:false |
選擇退出(CUDA 13.0+) | -device-entity-has-hidden-visibility=false | -static-global-template-stub=false |
選擇加入(CUDA 12.8+) | -device-entity-has-hidden-visibility=true | -static-global-template-stub=true |
表 1. CUDA 13.0 中 NVCC 的變更摘要,這些變更將影響 ELF 可見性以及__global__
函數和設備變數的鏈接
https://developer.nvidia.com/blog/cuda-c-compiler-updates-impacting-elf-visibility-and-linkage/