1. 程式人生 > >xmake新增對Cuda程式碼編譯支援

xmake新增對Cuda程式碼編譯支援

最近研究了下NVIDIA Cuda Toolkit的編譯環境,並且在xmake 2.1.10開發版中,新增了對cuda編譯環境的支援,可以直接編譯*.cu程式碼。

下載安裝好Cuda SDK後,在macosx上回預設安裝到/Developer/NVIDIA/CUDA-x.x目錄下,Windows上可以通過CUDA_PATH的環境變數找到對應的SDK目錄,而
Linux下預設會安裝到/usr/local/cuda目錄下。

xmake在執行$ xmake 命令編譯*.cu程式碼的時候,會嘗試探測這些預設的安裝目錄,然後嘗試呼叫nvcc編譯器直接編譯cuda程式,大部分情況下只需要執行:

$ xmake

建立和編譯Cuda工程

我之前編譯之前,我們可以通過xmake建立一個空的cuda工程,例如:

$ xmake create -l cuda test
$ cd test
$ xmake

通過-l引數指定建立一個cuda程式碼工程,工程名為test,執行輸出如下:

[00%]: ccache compiling.release src/main.cu
[100%]: linking.release test

我們也可以嘗試直接執行這個cuda程式:

$ xmake run

接著我們來看下,這個cuda工程的xmake.lua檔案:

-- define target
target("test") -- set kind set_kind("binary") -- add include directories add_includedirs("inc") -- add files add_files("src/*.cu") -- generate SASS code for each SM architecture for _, sm in ipairs({"30", "35", "37", "50", "52", "60", "61", "70"}) do add_cuflags("-gencode arch=compute_"
.. sm .. ",code=sm_" .. sm) add_ldflags("-gencode arch=compute_" .. sm .. ",code=sm_" .. sm) end -- generate PTX code from the highest SM architecture to guarantee forward-compatibility sm = "70" add_cuflags("-gencode arch=compute_" .. sm .. ",code=compute_" .. sm) add_ldflags("-gencode arch=compute_" .. sm .. ",code=compute_" .. sm)

裡面大部分跟C/C++的工程描述類似,唯一的區別就是通過add_cuflags設定了一些cuda程式碼特有的編譯選項,這部分配置根據使用者的需求,可自己調整。

關於add_cuflags的更多說明,可閱讀xmake的官方文件

Cuda編譯環境的配置

預設情況下,xmake都能成功檢測到系統中安裝的Cuda SDK環境,使用者不需要做額外的配置操作,當然如果遇到檢測不到的情況,使用者也可以手動指定Cuda SDK的路徑:

$ xmake f --cuda_dir=/usr/local/cuda
$ xmake

來告訴xmake,你當前的Cuda SDK的安裝目錄在哪裡。

如果想要測試xmake對當前cuda環境的探測支援,可以直接執行:

$ xmake l detect.sdks.find_cuda_toolchains
{
    linkdirs =
    {
        /Developer/NVIDIA/CUDA-9.1/lib
    }

,   bindir = /Developer/NVIDIA/CUDA-9.1/bin
,   includedirs =
    {
        /Developer/NVIDIA/CUDA-9.1/include
    }

,   cudadir = /Developer/NVIDIA/CUDA-9.1
}

來測試檢測情況,甚至可以幫忙貢獻相關檢測程式碼find_cuda_toolchains.lua來改進xmake的檢測過程。

其他說明

注:目前對cuda的支援剛剛完成,還沒正式發版,更多關於xmake對cuda的支援情況和進展,見:issues #158