作者:郭红飞2001 | 来源:互联网 | 2023-05-17 07:26
请问cubin文件怎么得到?我在visualstudio2005里建立了一个project,但是运行后并没有cubin文件产生。是需要在编译命令行里设置吗?另外,ptx汇编代码在那里看?直接用反汇
请问cubin文件怎么得到?我在visual studio 2005里建立了一个project,但是运行后并没有cubin文件产生。是需要在编译命令行里设置吗?另外,ptx汇编代码在那里看?直接用反汇编看吗?
17 个解决方案
用以下编译命令可生成cubin文件sample.cubin:
"H:\CUDA\bin\nvcc.exe" -ccbin "C:\Program Files\Microsoft Visual Studio 8\VC\bin" -I"H:\CUDA\include" -I"H:\CUDA\common\inc" --cubin --ptxas-optiOns=-v -O2 -D_CONSOLE -arch compute_11 -code sm_11 sample.cu
用以下编译命令可生成ptx文件sample.ptx:
"H:\CUDA\bin\nvcc.exe" -ccbin "C:\Program Files\Microsoft Visual Studio 8\VC\bin" -I"H:\CUDA\include" -I"H:\CUDA\common\inc" --ptx -O2 -D_CONSOLE -arch compute_11 -code sm_11 sample.cu
要注意sdk安装路径。
谢谢l7331014!
按l7331014的提示作了如下操作:
生成cubin文件idct.cubin:
"$(CUDA_BIN_PATH)\nvcc.exe" -ccbin "$(VCInstallDir)bin" -I"$(CUDA_INC_PATH)" --cubin --ptxas-optiOns=-v -O2 -D_DEBUG -arch compute_11 -code sm_11 idct.cu
结果如下:
1>idct.cu
1>tmpxft_0000109c_00000000-3_idct.cudafe1.gpu
1>tmpxft_0000109c_00000000-8_idct.cudafe2.gpu
1>ptxas info : Compiling entry function '__globfunc__Z8FastIdctPiS_S_Pl'
1>ptxas info : Used 17 registers, 32+32 bytes smem, 16 bytes cmem[1]
1>正在链接...
1>LINK : fatal error LNK1181: 无法打开输入文件“.\Debug\idct.obj”
“无法打开输入文件” 是需要还添加编译选项-c吗?我添加如下:
"$(CUDA_BIN_PATH)\nvcc.exe" -ccbin "$(VCInstallDir)bin" -I"$(CUDA_INC_PATH)"
-c -DWIN32 --cubin --ptxas-optiOns=-v -O2 -D_DEBUG -arch compute_11 -code sm_11 idct.cu
结果如下:
1>nvcc fatal : More than one compilation phase specified
1>正在链接...
1>LINK : fatal error LNK1181: 无法打开输入文件“.\Debug\idct.obj”
请再指点。
生成ptx文件也有同样的问题,都是LINK : fatal error LNK1181: 无法打开输入文件“.\Debug\idct.obj”。
虽然联结不成功,但确实生成了cubin文件和ptx文件。
你又不要连接最后的结果。(我也是)
所以,简单忽略。呵呵。
倒过来想,生成cubin或ptx只是把nvcc编译的"中间结果"拿出来了。
"编译"本身没完成哪,哪来的结果? :)
在dos中生成的cubin的结果是,
9 registers , 2088+
1064 bytes shared memory , 4 bytes cmem[1]
而cubin文件:
architecture {sm_11}
abiversion {0}
modname {cubin}
code {
name = __globfunc__Z10muldMatrixPfS_S_iii
lmem = 0
smem = 2088
reg = 9
bar = 1
bincode {
...
}
const {
segname = const
segnum = 1
offset = 0
bytes = 4
mem {
0x000003ff
}
}
}
2088应该是一个线程的smem的大小吧,1064是什么呢?
在我自己的程序中,我只分配了2048大小的smem,多出来的是什么?
谢谢!!!
我上面好像想错了,假设一个block有256个线程,我在一个thread中声明一个shared类型的存储区域,这个区域应该是整个block使用的,如果这个大小是2048bytes,那么,应该整个block的smem大小是2048,而不是2048*256。
这样理解对吗?
我使用vs编译规则得到.cubin文件,可是用写字板打开都是乱码,怎么回事啊?我用的是SDK中的例子,我的显卡是gt240,应该不存在寄存器超出的问题?我现在找不到原因了?求高手指点