k-wave使用CUDA加速遇到的问题(MATLABr2019a+CUDA10.1+VS2019)
参考链接:
https://zhuanlan.zhihu.com/p/478237038
问题描述:
按照上述链接进行,出现了一系列问题,解决了很久才搞好,故作此记录。
前期准备:
按照上述参考链接的内容,进行以下几个步骤:
- 我的matlab版本为R2019a,亲测R2019b之后的版本与k-wave不太兼容;
- 安装Visual Studio,注意:我原本使用VS2022,会报错;遂准备安装VS2017,但在官网找不到社区版,故最终我用的是VS2019,这也许和后面我遇到的问题有关,那么在此也为使用VS2019进行仿真的伙伴们提供参考;
- 下载和安装hdf5,按照参考链接的步骤走即可;
- 下载和安装CUDA,按照参考链接的步骤走即可;注意:此处因为我以前用过CUDA进行训练,所以没有重复安装。我的情况为:GeForce GTX 1060,Intel® Core™ i7-7700HQ CPU @ 2.80GHz ,CUDA 10.1;
- 下载k-wave的CUDA源码,进行编译:
- 下载源码;
- 解压得到工程;
- 修改文件中的CUDA版本;
- 编译;我的问题主要出现在编译这部分,下面会进行详细叙述;
编译中遇到的问题
我们来到编译这块:
-
按照参考链接所述,用VS打开刚才保存的工程文件,右键属性;
-
选择release版本;
-
检查是否把hdf5的路径都包含;
C:\Program Files\HDF_Group\HDF5\1.10.6\include,
C:\Program Files\HDF_Group\HDF5\1.10.6\bin
C:\Program Files\HDF_Group\HDF5\1.10.6\lib
-
在CUDA C/C++ - Device中,修改“Code Generation”:
这里我出现了第一个问题:我的属性页中没有CUDA C/C++这一选项
解决办法:配置CUDA的环境变量,并在VS中进行CUDA配置
-
配置CUDA的环境变量:
参考链接:https://blog.youkuaiyun.com/caomin1hao/article/details/103672614其中的第二步:二、CUDA环境变量配置
-
右键点击“此电脑”-“属性”-“高级系统设置”-“环境变量”
-
在环境变量中添加:
CUDA_SDK_PATH = C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.1 CUDA_LIB_PATH = %CUDA_PATH%\lib\x64 CUDA_BIN_PATH = %CUDA_PATH%\bin CUDA_SDK_BIN_PATH = %CUDA_SDK_PATH%\bin\win64 CUDA_SDK_LIB_PATH = %CUDA_SDK_PATH%\common\lib\x64
上述路径请按照实际情况进行添加,若找不到CUDA的位置,可以在cmd输入
set CUDA
寻找 -
重启电脑,在cmd中输入
set CUDA
,能够看到以下界面: -
检查安装情况:
-
在cmd输入
cd C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\demo_suite
-
继续输入deviceQuery.exe
-
如果最后一行的Result=PASS则为安装完好,否则重新安装或者更换版本;
-
-
-
在VS中配置CUDA
参考链接:https://blog.youkuaiyun.com/weixin_43051346/article/details/113696917中的第三步:3 VS中CUDA的配置-
找到
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\visual_studio_integration\MSBuildExtensions
并将内部的四个文件全都复制到Visual Studio安装目录下的community\MSBuild\Microsoft\VC\v160\BuildCustomizations
文件夹中,例如我的文件夹为:F:\ENGapps\Visual Studio\community\MSBuild\Microsoft\VC\v160\BuildCustomizations
-
然后在VS中,在之前参考链接中打开的属性页里,选择“通用属性”-“VC++目录”中,分别添加
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include
与C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\lib\x64
-
接下来编辑“链接器”-“输入”中的“附加依赖项”
加入以下内容:
cublas.lib
cublasLt.lib
cuda.lib
cudadevrt.lib
cudart.lib
cudart_static.lib
cufft.lib
cufftw.lib
curand.lib
cusolver.lib
cusparse.lib
nppc.lib
nppial.lib
nppicc.lib
nppicom.lib
nppidei.lib
nppif.lib
nppig.lib
nppim.lib
nppist.lib
nppisu.lib
nppitc.lib
npps.lib
nvblas.lib
nvgraph.lib
nvml.lib
nvrtc.lib
OpenCL.lib
-
全部确定后,关闭VS,重新使用VS打开之前所说的工程kspaceFirstOrder-CUDA.vcxproj,并打开其属性页,可以发现已经具有CUDA C/C++这一项;
-
-
-
在CUDA C/C++ - Device中,修改“Code Generation”,
注意:这个地方需要查看自己的显卡对应的算力:
参考链接:https://blog.youkuaiyun.com/qq_41070955/article/details/108269915
比如我的显卡是1060,对应算力为6.1,所以我最终留下了compute_30,sm_30和compute_61,sm_61;前面的30我是看别人保留我才留的,后面的61是对应了我自己显卡的算力:
-
生成
我在这里出现了编译错误
详细错误log在VS下方可以看到,如果没有显示详细错误,可以在C:\Users\你的用户名\AppData\Local\Temp中打开最新产生的.log文件中查看。
我的报错主要有两种,分别截取两种报错其中的一个出来看:
-
F:\ENGapps\k_wave_tools\k-wave-toolbox-version-1.3-cpp-windows-source\kspaceFirstOrder-CUDA\Sources\Hdf5/Hdf5File.h(471): error : namespace "std" has no member "string"
-
F:\ENGapps\Visual Studio\community\MSBuild\Microsoft\VC\v160\BuildCustomizations\CUDA 10.1.targets(764,9): error MSB3721: 命令“"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvcc.exe" -gencode=arch=compute_30,code=\"sm_30,compute_30\" -gencode=arch=compute_61,code=\"sm_61,compute_61\" --use-local-env -ccbin "F:\ENGapps\Visual Studio\community\VC\Tools\MSVC\14.29.30133\bin\HostX64\x64" -x cu -rdc=true -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include" --keep-dir x64\Release --machine 64 --compile -cudart static -use_fast_math -DWIN64 -DNDEBUG -D_CONSOLE -D_MBCS -D"__KWAVE_GIT_HASH__=\"468dc31c2842a7df5f2a07c3a13c16c9b0b2b770\"" -Xcompiler "/EHsc /W3 /nologo /O2 /Fdx64\Release\vc142.pdb /FS /Zi /MD " -o x64\Release\OutputStreamsCudaKernels.cu.obj "F:\ENGapps\k_wave_tools\k-wave-toolbox-version-1.3-cpp-windows-source\kspaceFirstOrder-CUDA\Sources\OutputStreams\OutputStreamsCudaKernels.cu"”已退出,返回代码为 1。
(1)我首先对错误2,也就是MSB3721进行了查询,在链接中,得到说错误MSB3721只是一个VS的非特定错误,只是告诉我们它运行了nvcc.exe,然后返回了错误。至于实际产生的错误,是在报MSB3721之前输出的详细错误。
所以我们需要解决的实际上是错误1。
(2)遂我们找到每一次报错误1的error,发现全都是在
\k-wave-toolbox-version-1.3-cpp-windows-source\kspaceFirstOrder-CUDA\Sources\Hdf5/Hdf5File.h
中出现了error : namespace "std" has no member "string"
。(3)对此,我们需要打开该.h文件(注意保留原本的版本哦,以防出问题TAT),找到466行,也就是
#include <map>
,然后在其后加上#include <string> #include <stack>
然后在之后的
#include <Utils/DimensionSizes.h>
后面,加上using namespace std;
(5)保存。
这一解决方法我查自:https://www.codeproject.com/Questions/5250868/Namespace-std-has-no-member-string-error-in-a-Cplu
(6)重新生成,可以发现两种error都解决了,虽然还有很多warnings- -,但是确实在
k-wave-toolbox-version-1.3-cpp-windows-source\kspaceFirstOrder-CUDA\x64\Release
文件下生成了可执行文件。 -
-
按照参考链接所述,将
kspaceFirstOrder-CUDA\x64\Release(上文编译的工程的位置) c:\Program Files\HDF_Group\HDF5\1.10.6\bin C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.5\bin
这三个文件夹下的内容全都移动到k-wave工具包下的binaries文件夹下:
-
打开MATLAB,并将仿真的最后一句改为加G的形式
sensor_data = kspaceFirstOrder2DG(kgrid, medium, source, sensor);
-
运行,如果出现以下输出则说明加速成功:
U1S1,确实快,之前我需要几十分钟才能够仿真的东西,现在只需要一分多钟。
这些问题花了我不少时间,中间兜兜转转试了很多没有用的办法,感觉要解决问题还是一定要定义到问题本身中去。
不过终于大功告成了,开心!