如何在Visual Studio中将英特尔C ++编译器icl指定为CUDA项目的主编译器

时间:2016-01-13 01:53:13

标签: visual-studio-2013 cuda

在visual studio中的CUDA项目的项目属性页面中,似乎可以选择自定义主机编译器。但是在我选择了intel C ++编译器之后,-ccbin选项仍然指向cl.exe。

selecting intel C++ compiler as the platform toolset

the -ccbin option still points to cl.exe

我明白在Windows环境下,CUDA项目的默认主机编译器是cl.exe,以下帖子确认cl.exe是windwos上的唯一选项。但是这些是很久以前的事了,我想再次询问是否仍然如此,或者我们现在使用不同的主编译器?

Intel C++ Composer and CUDA

Specify compiler NVCC uses to compile host-code

2 个答案:

答案 0 :(得分:2)

情况仍然如此。 the installation guide for windows中列出了唯一受支持的环境。未列出intel编译器。

相比之下,linux installation guide的相应部分表明主机编译器支持某个版本的intel编译器(ICC)。

将来,您应该可以参考使用较新的CUDA工具包发布的相应文档来确定编译器支持。

答案 1 :(得分:0)

我经常发现自己使用英特尔C ++和CUDA进行流体模拟,如果您仍然对答案感兴趣,我可以提供帮助。

您尚未指定要引用的Visual Studio版本,但我暗示您正在讨论Visual Studio Professional / Enterprise或任何一系列功能齐全的IDE。

虽然我没有广泛使用其中的任何一种,但有一种方法可以在Visual Studio Code中使用带有CUDA的英特尔C ++(以及扩展名,任何编译器)。如果您决定采用这条路线,并且因为您提到了Windows,请执行以下步骤:

为简单起见,请从here下载C ++教程。如果您想自己制作版本,请在MSDN here上找到相关说明。

下载后,您应该在项目目录中有一个build.bat文件。打开文件进行编辑。

替换build.bat文件中的所有内容,如下所示:

@echo off

call "Path\to\compilervars.bat" intel64    
call "Path\to\vcvarsall.bat" x64
set compilerflags=/Zi /EHsc -I"%MKLROOT%"\include    
set linkerflags= mkl_intel_ilp64.lib mkl_intel_thread.lib mkl_core.lib libiomp5md.lib

icl.exe  /Foobj\helloworld /Fdobj\ -c  -I. -I"%CUDA_PATH%"\include %compilerflags% helloworld.cpp /link %linkerflags% 

"Path\to\nvcc.exe" -gencode=arch=compute_61,code=\"sm_61,compute_61\" -IPath\to\CUDA\include  -G -maxrregcount=0  --machine 64 --compile -cudart static -g  -DWIN64 -DNDEBUG -D_CONSOLE -Xcompiler "/EHsc /W3 /nologo /Od /FS /Fdobj\ /Zi /RTC1 /MD /MP" -o obj\hello2.obj "hello.cu"
icl.exe -o bin\hello.exe /Fdobj\ obj\hello2.obj obj\helloworld.obj "%CUDA_PATH%"\lib\x64\cudart.lib %compilerflags% /link %linkerflags%

换句话说,我们告诉构建过程:

查找compilervars.bat文件(可在英特尔C ++编译器/ bin文件夹中找到)并为构建过程设置英特尔特定的宏和变量

查找vcvarsall.bat文件(在Visual C ++编译器/ VC文件夹中找到)并为构建过程设置Visual C ++特定的宏和变量

为英特尔C ++编译器设置编译器和链接器标志。

重要事项:调用英特尔C ++编译器从所有非CUDA生成一个Obj文件(即项目的.cpp文件 - 在本例中为helloworld.cpp)并包含CUDA如果你需要它们的标题。确保没有CUDA内核调用(带<<<<>>>>的函数)。

THEN:调用CUDA编译器从所有CUDA文件生成一个Obj文件(即.cu扩展名 - 在本例中为hello.cu),在这种情况下,我调用Obj文件hello2.obj(我明确地重命名它以告诉你如何做到这一点)。

最终通过提及Obj文件以及用于静态链接的cudart库,调用C ++编译器生成可执行文件。

请注意,CUDA仍然需要VC ++,因此我们允许它仅在编译CUDA文件的部分访问VC ++(这就是为什么我们必须初始化vcvarsall.bat),并坚持使用英特尔C ++。