歡迎您光臨本站 註冊首頁

xmake v2.2.7 發布, 改進Cuda項目構建

←手機掃碼閱讀     admin @ 2019-06-20 , reply:0

這個版本主要對Cuda項目的構建做了很多的改進,並且新增了對lex/yacc編譯支持,同時也對target新增了on_linkbefore_linkafter_link等鏈接階段的定製化支持。

這裡,我還要感謝下@OpportunityLiu對xmake的支持,這個版本中OpportunityLiu貢獻了大量的代碼去改進Cuda的支持。 此外,他還幫忙改進了xmake的整個單元測試框架,自更新程序,命令行tab補全以及ci腳本,使得xmake的更新迭代更加高效和穩定。

新特性介紹

Cuda項目構建改進

頭文件依賴檢測和增量編譯

2.2.6之前的版本,對cuda的編譯支持並不是很完善,至少連頭文件依賴檢測也是沒有提供的,因此如果cuda代碼一多,每次改動都會編譯所有,並不能像c/c++代碼那樣做到檢測改動,進行增量編譯。

而在新版本中,xmake對其進行了支持,現在已經可以很好的在不同平台下,處理依賴關係了,這對日常編譯和開發效率也會有不少的提升。

新增gencodes設置相關api

之前的版本,添加gencodes配置非常的繁瑣,並不簡潔,可以看下之前的配置:

target("cuda_console")
    set_kind("binary")
    add_files("src/*.cu")

    add_cuflags("-gencode arch=compute_30,code=sm_30", "-gencode arch=compute_35,code=sm_35")
    add_cuflags("-gencode arch=compute_37,code=sm_37", "-gencode arch=compute_50,code=sm_50")
    add_cuflags("-gencode arch=compute_52,code=sm_52", "-gencode arch=compute_60,code=sm_60")
    add_cuflags("-gencode arch=compute_61,code=sm_61", "-gencode arch=compute_70,code=sm_70")
    add_cuflags("-gencode arch=compute_70,code=compute_70")

    add_ldflags("-gencode arch=compute_30,code=sm_30", "-gencode arch=compute_35,code=sm_35")
    add_ldflags("-gencode arch=compute_37,code=sm_37", "-gencode arch=compute_50,code=sm_50")
    add_ldflags("-gencode arch=compute_52,code=sm_52", "-gencode arch=compute_60,code=sm_60")
    add_ldflags("-gencode arch=compute_61,code=sm_61", "-gencode arch=compute_70,code=sm_70")
    add_ldflags("-gencode arch=compute_70,code=compute_70")

因此為了精簡xmake.lua的配置,針對cuda項目增加的add_cugencodesapi來簡化配置,改進后如下:

target("cuda_console")
    set_kind("binary")
    add_files("src/*.cu")

    -- generate SASS code for each SM architecture
    add_cugencodes("sm_30", "sm_35", "sm_37", "sm_50", "sm_52", "sm_60", "sm_61", "sm_70")

    -- generate PTX code from the highest SM architecture to guarantee forward-compatibility
    add_cugencodes("compute_70")

另外當配置成add_cugencodes("native")的時候,xmake會自動探測當前設備支持的gencodes,自動添加進來,會更加的方便高效。

這個,也要感謝下OpportunityLiu提供的探測代碼以及對add_cugencodes的實現。

device-link設備鏈接支持

新版本中,xmake基本上重構了整個cuda的構建過程,將cuda相關構建抽離到獨立的cuda構建rule中去維護,並且默認採用了device-link的鏈接方式。

關於device-link的描述和好處,可以參考相關官方介紹:https://devblogs.nvidia.com/separate-compilation-linking-cuda-device-code/

我們在編譯包含跨編譯單元的 __global__ 或 __device__函數的調用的時候也是需要devlink的,因此在xmake中,目前默認就是開啟了devlink。

對於用戶來講,並不需要對xmake.lua做任何改動,當然如果用戶想要手動禁用devlink,也是可以的:

target("test")
    set_kind("binary")
    add_files("src/*.cu")
    add_values("cuda.devlink", false) -- 顯式禁用默認的device-link行為

支持用clang編譯cuda項目

clang目前也支持對*.cu文件的編譯,不過不同版本的clang支持的cuda版本是有一定限制的,clang7隻能支持cuda7-9.2,8支持到10,要支持10.1得需要clang9。

而xmake除了支持調用nvcc來編譯cuda項目,也可以直接切到clang來編譯,例如:

xmake f --cu=clang
xmake

不過關於devlink,似乎還是需要依賴nvcc,clang並不支持。

可配置切換nvcc使用的c++編譯器

xmake新增了--ccbin=參數可以配置切換,nvcc默認使用的c++編譯器和鏈接器,用法如下:

xmake f --ccbin=clang++
xmake

即可讓nvcc在編譯cuda代碼的時候,內部調用clang++編譯器。

定製化鏈接過程

在新版本中,我們加入了跟link鏈接階段相關的定製化處理,用戶可以通過在target/rule中實現on_linkbefore_linkafter_link來擴展定製自己的鏈接過程。

比如,我們想在正常c/c++代碼的鏈接階段前,預處理一些其他的事情,比如對*.o文件做些處理什麼的,那麼就可以在before_link階段寫點自己的lua腳本就行了:

target("test")
    before_link(function (target) 
        print("process objects", target:objectfiles())
    end)

或者我們想改寫內置的鏈接過程,可以用on_link:

target("test")
    on_link(function (target) 
        print("link objects", target:objectfiles())
    end)

還有after_link則是在鏈接完成之後,做一些定製化任務。

Lex/Yacc編譯支持

當前xmake已經可以原生支持lex/flex, yacc/bison等對.l/.y文件的編譯處理,來快速開發一些跟編譯器相關的項目。

我們只需要添加lex,yacc兩個規則到target中,使其可以正常處理.l/.y文件,當然.ll/.yy也是支持的。

target("calc")
    set_kind("binary")
    add_rules("lex", "yacc")
    add_files("src/*.l", "src/*.y")

這裡有個例子代碼,可供參考:lex_yacc_example

運行環境設置改進

設置運行目錄

我們可以通過set_rundir介面用於設置默認運行target程序的當前運行目錄,如果不設置,默認情況下,target是在可執行文件所在目錄載入運行。

如果用戶想要修改載入目錄,一種是通過on_run()的方式自定義運行邏輯,裡面去做切換,但僅僅為了切個目錄就這麼做,太過繁瑣。

因此可以通過這個介面快速的對默認執行的目錄環境做設置切換。

target("test")
    set_kind("binary")
    add_files("src/*.c")
    set_rundir("$(projectdir)/xxx")

添加運行環境變數

另外一個新介面add_runenvs可用於添加設置默認運行target程序的環境變數。

target("test")
    set_kind("binary")
    add_files("src/*.c")
    add_runenvs("PATH", "/tmp/bin", "xxx/bin")
    add_runenvs("NAME", "value")

命令行tab補全支持

為了改善用戶體驗,新版本中對命令行下xmake命令參數tab補全也做了支持,用戶可以很方便快速的tab出xmake的所有命令參數。

當前支持zsh/bash/sh以及powershell。

更加方便的自更新命令

之前的版本,xmake已經提供了方便的自更新命令xmake update來更新xmake自身版本,甚至是更新指定分支版本,例如:xmake update dev/master

但是,還有些不足的地方:

  1. 每次更新都需要重新編譯core,所以更新很慢,然而很多情況下,新版本僅僅只有腳本變動,core並不會變

  2. 更新指定dev/master分支,在windows上實現的並不完美,有點滯后,並不能即時同步到線上dev/master版本。

因此,這塊OpportunityLiu幫忙做了很多的改進工作:

  1. 提供xmake update -s/--scriptonly參數,僅僅更新lua腳本,不去額外編譯core,實現快速的迭代更新

  2. 改進ci腳本,在windows上實現ci自動化構建,xmake update dev自動拉取ci上預構建好的安裝包下載更新

  3. 可以指定從其他github repo上更新xmake,方便貢獻者更新自己的fork版本,也方便用戶切換鏡像repo,xmake update gitee:tboox/xmake

更新內容

新特性

  • #440: 為target/run添加set_rundir()add_runenvs()介面設置

  • #443: 添加命令行tab自動完成支持

  • 為rule/target添加on_link,before_linkafter_link階段自定義腳本支持

  • #190: 添加add_rules("lex", "yacc")規則去支持lex/yacc項目

改進

  • #430: 添加add_cucodegens()api為cuda改進設置codegen

  • #432: 針對cuda編譯支持依賴分析檢測

  • #437: 支持指定更新源,xmake update github:xmake-io/xmake#dev

  • #438: 支持僅更新腳本,xmake update --scriptonly dev

  • #433: 改進cuda構建支持device-link設備代碼鏈接

  • #442: 改進tests測試框架


[admin ]

來源:OsChina
連結:https://www.oschina.net/news/107596/xmake-2-2-7-released
xmake v2.2.7 發布, 改進Cuda項目構建已經有294次圍觀

http://coctec.com/news/all/show-post-207661.html