【k-wave使用日记】使用CUDA加速遇到的问题(MATLABr2019a+CUDA10.1+VS2019)

k-wave使用CUDA加速遇到的问题(MATLABr2019a+CUDA10.1+VS2019)

参考链接:

https://zhuanlan.zhihu.com/p/478237038

问题描述:

按照上述链接进行,出现了一系列问题,解决了很久才搞好,故作此记录。

前期准备:

按照上述参考链接的内容,进行以下几个步骤:

  1. 我的matlab版本为R2019a,亲测R2019b之后的版本与k-wave不太兼容;
  2. 安装Visual Studio,注意:我原本使用VS2022,会报错;遂准备安装VS2017,但在官网找不到社区版,故最终我用的是VS2019,这也许和后面我遇到的问题有关,那么在此也为使用VS2019进行仿真的伙伴们提供参考;
  3. 下载和安装hdf5,按照参考链接的步骤走即可;
  4. 下载和安装CUDA,按照参考链接的步骤走即可;注意:此处因为我以前用过CUDA进行训练,所以没有重复安装。我的情况为:GeForce GTX 1060,Intel® Core™ i7-7700HQ CPU @ 2.80GHz ,CUDA 10.1;
  5. 下载k-wave的CUDA源码,进行编译:
    1. 下载源码;
    2. 解压得到工程;
    3. 修改文件中的CUDA版本;
    4. 编译;我的问题主要出现在编译这部分,下面会进行详细叙述;

编译中遇到的问题

我们来到编译这块:

  1. 按照参考链接所述,用VS打开刚才保存的工程文件,右键属性;

  2. 选择release版本;

  3. 检查是否把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
  1. 在CUDA C/C++ - Device中,修改“Code Generation”:

    这里我出现了第一个问题:我的属性页中没有CUDA C/C++这一选项

    解决办法:配置CUDA的环境变量,并在VS中进行CUDA配置

    1. 配置CUDA的环境变量:

      参考链接:https://blog.csdn.net/caomin1hao/article/details/103672614其中的第二步:二、CUDA环境变量配置

      1. 右键点击“此电脑”-“属性”-“高级系统设置”-“环境变量”

      2. 在环境变量中添加:

        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寻找

      3. 重启电脑,在cmd中输入set CUDA,能够看到以下界面: 在这里插入图片描述

      4. 检查安装情况:

        1. 在cmd输入

          cd C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\demo_suite在这里插入图片描述

        2. 继续输入deviceQuery.exe
          在这里插入图片描述

        3. 如果最后一行的Result=PASS则为安装完好,否则重新安装或者更换版本;
          在这里插入图片描述

    2. 在VS中配置CUDA
      参考链接:https://blog.csdn.net/weixin_43051346/article/details/113696917中的第三步:3 VS中CUDA的配置

      1. 找到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
        在这里插入图片描述
        在这里插入图片描述

      2. 然后在VS中,在之前参考链接中打开的属性页里,选择“通用属性”-“VC++目录”中,分别添加C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\includeC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\lib\x64
        在这里插入图片描述

      3. 接下来编辑“链接器”-“输入”中的“附加依赖项”
        加入以下内容:
        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
        在这里插入图片描述

      4. 全部确定后,关闭VS,重新使用VS打开之前所说的工程kspaceFirstOrder-CUDA.vcxproj,并打开其属性页,可以发现已经具有CUDA C/C++这一项;

  2. 在CUDA C/C++ - Device中,修改“Code Generation”,

    注意:这个地方需要查看自己的显卡对应的算力:

    参考链接:https://blog.csdn.net/qq_41070955/article/details/108269915

    比如我的显卡是1060,对应算力为6.1,所以我最终留下了compute_30,sm_30和compute_61,sm_61;前面的30我是看别人保留我才留的,后面的61是对应了我自己显卡的算力:

    在这里插入图片描述

  3. 生成

    我在这里出现了编译错误

    详细错误log在VS下方可以看到,如果没有显示详细错误,可以在C:\Users\你的用户名\AppData\Local\Temp中打开最新产生的.log文件中查看。

    我的报错主要有两种,分别截取两种报错其中的一个出来看:

    1. 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"
      
    2. 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文件下生成了可执行文件

    在这里插入图片描述

  4. 按照参考链接所述,将

    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文件夹下:

    在这里插入图片描述

  5. 打开MATLAB,并将仿真的最后一句改为加G的形式

    sensor_data = kspaceFirstOrder2DG(kgrid, medium, source, sensor);
    
  6. 运行,如果出现以下输出则说明加速成功:
    在这里插入图片描述
    在这里插入图片描述

U1S1,确实快,之前我需要几十分钟才能够仿真的东西,现在只需要一分多钟。

这些问题花了我不少时间,中间兜兜转转试了很多没有用的办法,感觉要解决问题还是一定要定义到问题本身中去。

不过终于大功告成了,开心!

猜你喜欢

转载自blog.csdn.net/m0_46505453/article/details/126503734