-
-
Notifications
You must be signed in to change notification settings - Fork 812
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
如何实现 cuda 的 device-link? #433
Comments
可以加个 cuda.device_link 的rule规则,不过目前rule和target还不支持 link 阶段的 定制,这块等我想想,改进下rule后,在处理这个好了。。 |
感觉既然有了构建工具,这个流程才是更正确的,而且这样 cu-ld 和 ld 分开配置也更灵活,可以考虑搞成cuda 工程的默认构建流程 |
目前除了纯c/++项目,其他项目的构建过程 就是通过rule来分离的,像qt项目的设置 qt.application rule就是qt项目的默认构建 cuda的项目,目前是跟c/c++默认的构建行为一致,所以我暂时没加rule,如果觉得cuda的项目 行为差异比较大,或者需要一些特殊处理,可以像qt/wdk等项目一样,默认就通过rule来分离,标示为cuda项目 例如: target("test")
add_rules("cuda.console")
add_files("src/*.cu") 通过内置的: 内置对cuda项目的各种默认构建规则处理,包括内置的device-link处理逻辑。 |
rule/target的 on_link, before_link, after_link 阶段我也开放出来了,下一步我打算吧cuda项目的构建规则完全独立出来,像qt/sdk项目一样 目前规划可以创建以下三类项目,以后如果还有其他cuda项目类型,也可基于此扩展:
项目描述: target("test")
add_rules("cuda.console")
add_files("src/*.cu") 然后在里面我会内置各种跟cuda相关的构建rule,包括link阶段会默认改用 device-link 包括之前 includes里面 cuda.add_codegende 那个 rule 我也会内置在 cuda.console 这三大项目规则里面去生效 add_cucodegens 里面 就不必重复 apply cuda.add_codegende 这个规则了 这块我下周来弄下好了。。 |
这块我初步改好了,你可以到cuda分支下试试。。 目前的处理方式:
因此,目前cuda项目的xmake.lua配置如下: target("test")
set_kind("binary")
add_includedirs("inc")
add_files("src/*.cu")
add_cugencodes("compute_60,sm_60")
-- add_culdflags("-gencode arch=compute_60,code=sm_60") 跟现有之前的配置方式完全兼容,但是内部对cuda的构建处理,已经完全隔离到独立的cuda rule下面去了,也方便日后灵活扩展改进构建规则。 [ 0%]: ccache compiling.release src/main.cu
/usr/local/bin/ccache /Developer/NVIDIA/CUDA-10.1/bin/nvcc -c -Iinc -gencode arch=compute_60,code=sm_60 -m64 -Xcompiler -arch -Xcompiler x86_64 -I/Developer/NVIDIA/CUDA-10.1/include -ccbin /usr/bin/clang -o build/.objs/testc/macosx/x86_64/release/src/main.cu.o src/main.cu
[100%]: devlinking.release testc_gpucode.cu.o
/Developer/NVIDIA/CUDA-10.1/bin/nvcc -o build/.objs/testc/macosx/x86_64/release/.cuda/devlink/testc_gpucode.cu.o build/.objs/testc/macosx/x86_64/release/src/main.cu.o -gencode arch=compute_60,code=sm_60 -dlink
[100%]: linking.release testc
"/usr/bin/xcrun -sdk macosx clang++" -o build/macosx/x86_64/release/testc build/.objs/testc/macosx/x86_64/release/src/main.cu.o build/.objs/testc/macosx/x86_64/release/.cuda/devlink/testc_gpucode.cu.o -L/Developer/NVIDIA/CUDA-10.1/lib -Xlinker -rpath -Xlinker /Developer/NVIDIA/CUDA-10.1/lib -lcudart -arch x86_64 -mmacosx-version-min=10.14 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -stdlib=libc++ -lz 现在编译过程中,会额外增加一部device-link过程: [100%]: devlinking.release testc_gpucode.cu.o 最终的link过程,还是走 gcc/clang,所以cu-ld和ld是独立的,可分别设置对应的device-link/link的链接工具。 |
之前的 比如: qt + cuda 的规则同时生效也是有可能的,因此 当然,xmake探测到 *.cu 就会自动应用 |
@OpportunityLiu 你先试试吧,我目前只在mac下测过,其他平台暂时没环境测试,如果测试ok,我就更新下文档,merge过去了。 |
哦,方便的话,能否可以帮忙修下, xmake/xmake/rules/cuda/device_link/xmake.lua Lines 32 to 33 in 4fe1217
或者等晚上有时间 我再改下。 |
还有 需要
|
对这块不是很了解,device link 也需要 链接库么?我看之前你给的文档里面 并没有提到,所以我暂时只对 最终的link上 加上links/linkdirs。 |
一般来讲不会有人导出gpu函数到库里,不过我看给nvcc加的 -l 会传给nvlink,所以还是加上吧。 |
对速度没啥影响,只要确认devlink确实有可能需要处理link/linkdirs,那就加上好了。 在这里加上 target.links/ target.linkdirs等devlink需要的设置就行了 xmake/xmake/languages/cuda/xmake.lua Lines 119 to 123 in 4fe1217
|
CUDA 7.0 的时候抛弃的。。。 |
然后 host link 的时候是不是应该把几个cuda的库加上 |
devlink的时候漏了 ccbin,直接传 cu-cxx 应该可以 |
这个有点问题,默认链接应该是 “cudart_static”,指定 |
还有一些写在这边了 #449 |
肯定是需要的,不管nvcc编译cu还是devicelink,本质都是生成了一个.c文件,交给ccbin去编译的 |
研究了下发现默认的编译选项确实不需要 device-link,生成的GPU code也无法跨编译单元调用,只有在编译的时候加上 不过nvcc的默认流程还时常直接调用device-link的,所以这样编译速度也并不会变慢就是了
|
另外,生成静态库是不需要device-link的,可以看到,直接调用了lib
|
mac下也基本不用管x86,目前看 只有win上 说不定需要处理下。 |
恩,可以把缺的补上 |
当初拉dev的安装,是因为有时候 dev上新增的一些 api ,我就直接用在了 core/xmake.lua 了,用master编译 就通不过了,所以我才改用 每次都拉取最新的 xmake-dev.exe包来编译 不过改成 master,也ok |
ok,这块我看下 做些处理 |
我刚做了些改进和修复,你看看,生成static library这块,我还得研究下,暂时还没处理。。等回头有时间 我再看看 |
static下我现在跳过device link了,并且cudart库的设置 用户可以在xmake.lua中自己通过 add_links 或者 add_syslinks设置切换 是否用static 你再试试 |
类似这种流程
ref: https://devblogs.nvidia.com/separate-compilation-linking-cuda-device-code/
The text was updated successfully, but these errors were encountered: