.cu文件用nvcc编译为.exe后不能运行

  • 7 replies
  • 1332 views
*

queqd

  • *
  • 10
    • 查看个人资料
.cu文件用nvcc编译为.exe后不能运行
« 于: 十月 19, 2022, 09:09:47 pm »
.cu文件在visual studio2019上可以正常运行,但是在命令行中用nvcc kernel.cu -o kernel编译生成exe后运行exe程序不能运行。

Re: .cu文件用nvcc编译为.exe后不能运行
« 回复 #1 于: 十月 22, 2022, 07:18:44 pm »
用nvcc编译后生成的应该不是.exe文件吧,应该生成一个可执行文件,再去运行这个可执行文件

*

queqd

  • *
  • 10
    • 查看个人资料
Re: .cu文件用nvcc编译为.exe后不能运行
« 回复 #2 于: 十月 23, 2022, 09:27:22 pm »
我想用nsight compute分析一下程序,但是发现程序用,nvcc编译为exe后运行不了,并且在nsight compute选择该exe文件launch后显示连接失败。但是程序在VS2019上可以成功运行,不知道是什么原因。

Re: .cu文件用nvcc编译为.exe后不能运行
« 回复 #3 于: 十月 31, 2022, 05:51:26 pm »
.cu文件在visual studio2019上可以正常运行,但是在命令行中用nvcc kernel.cu -o kernel编译生成exe后运行exe程序不能运行。

如果是exe文件不能运行,那就奇怪了。VS2019里面也是通过nvcc编译的。

如果只是exe运行了,但是GPU的kernel没有运行,这种常见。常见于在VS里面有计算能力设定,但是命令行却没有,同时你的cuda toolkit的默认计算能力高于你的卡的计算能力的情况下。

可以用nvcc -arch sm_xx your.cu的方式来设定一下试试,其中xx是你的卡的型号,在GPU-Z网站上查询得到的计算能力。(例如sm_61, sm_35, sm_50, 类似这样)

Re: .cu文件用nvcc编译为.exe后不能运行
« 回复 #4 于: 十月 31, 2022, 05:57:58 pm »
如果是exe文件不能运行,那就奇怪了。VS2019里面也是通过nvcc编译的。

如果只是exe运行了,但是GPU的kernel没有运行,这种常见。常见于在VS里面有计算能力设定,但是命令行却没有,同时你的cuda toolkit的默认计算能力高于你的卡的计算能力的情况下。

可以用nvcc -arch sm_xx your.cu的方式来设定一下试试,其中xx是你的卡的型号,在GPU-Z网站上查询得到的计算能力。(例如sm_61, sm_35, sm_50, 类似这样)

此外,你的程序如果在VS下运行,可能默认当前路径不同,如果你用了一些数据文件之类的,可能在VS下能打开,直接exe打不开从而导致运行失败之类的,都是有可能的。不妨排查一下。至于NSight性能调优,你先解决了你的运行问题再说吧。不要一个帖子同时说两点,这样可能会弄乱你对问题的所在的分析的。

*

queqd

  • *
  • 10
    • 查看个人资料
Re: .cu文件用nvcc编译为.exe后不能运行
« 回复 #5 于: 十一月 01, 2022, 10:14:24 am »
此外,你的程序如果在VS下运行,可能默认当前路径不同,如果你用了一些数据文件之类的,可能在VS下能打开,直接exe打不开从而导致运行失败之类的,都是有可能的。不妨排查一下。至于NSight性能调优,你先解决了你的运行问题再说吧。不要一个帖子同时说两点,这样可能会弄乱你对问题的所在的分析的。
您好,经过测试,exe不能运行的原因应该是我读取了一些txt文本中的数据,在VS下能够读取并运行程序,但是exe打不开所以运行失败,不知道这个问题应该怎么进行解决?

Re: .cu文件用nvcc编译为.exe后不能运行
« 回复 #6 于: 十一月 01, 2022, 01:28:29 pm »
您好,经过测试,exe不能运行的原因应该是我读取了一些txt文本中的数据,在VS下能够读取并运行程序,但是exe打不开所以运行失败,不知道这个问题应该怎么进行解决?

如同之前说的,如果单独运行exe打开文件失败,在VS下运行却可以打开文件,最大的可能是路径问题。你可以直接使用绝对路径,来避免这种情况。例如说:"d:\\files\\a.txt", 类似这种路径。

如果你还有能力,可以考虑在Windows下使用GetModuleFileNameA(), 使用NULL作为句柄,这会得到当前exe的全路径,然后你可以从全路径出发,从最后一个反斜杠后面开始替换,例如:
"C:\\dog\\cat\\wolf.exe"
和同时在C盘的dog文件夹的cat文件夹下面,和exe在一起放置有data.txt
则你可以从最后一处反斜杠开始替换,得到
"C:\\dog\\cat\\data.txt"
这样就不用写绝对路径了,灵活一点。



*

queqd

  • *
  • 10
    • 查看个人资料
Re: .cu文件用nvcc编译为.exe后不能运行
« 回复 #7 于: 十一月 03, 2022, 02:50:19 pm »
如同之前说的,如果单独运行exe打开文件失败,在VS下运行却可以打开文件,最大的可能是路径问题。你可以直接使用绝对路径,来避免这种情况。例如说:"d:\\files\\a.txt", 类似这种路径。

如果你还有能力,可以考虑在Windows下使用GetModuleFileNameA(), 使用NULL作为句柄,这会得到当前exe的全路径,然后你可以从全路径出发,从最后一个反斜杠后面开始替换,例如:
"C:\\dog\\cat\\wolf.exe"
和同时在C盘的dog文件夹的cat文件夹下面,和exe在一起放置有data.txt
则你可以从最后一处反斜杠开始替换,得到
"C:\\dog\\cat\\data.txt"
这样就不用写绝对路径了,灵活一点。
最后发现是主机端读取一个txt文本中的二维数组时出现了问题,已经解决,感谢您提供的思路