我正在使用Visual Studio 2013开发CUDA(7.0)项目。该项目是64位。 我正在使用驱动程序API,需要从ptx或cubin文件加载模块。但是我找不到该文件。 在VS中我去属性 - > CUDA C / C ++ - > 通用 - > NVCC编译类型 ,将其更改为-cubin或ptx。编译器完成正常但我找不到该文件。我只能看到 kernel.cu.obj 和 kernel.cu.cache 输出调试目录中的文件。这里有什么问题?
更新
如果我转到属性 - > CUDA C / C ++ - > Common->保留预处理文件并设置YES。然后我看到.ptx和其他中间内容。但据我所知这个选项不是强制获得.ptx?同样演示CUDA SDK项目,如“matrixMulDrv”spitr ptx,关闭该选项。我无法弄清楚区别在哪里。
这是matrixMulDrv项目编译命令:
C:\ ProgramData \ NVIDIA Corporation \ CUDA Samples \ v7.0 \ 0_Simple \ matrixMulDrv>“C:\ Program Files \ NVIDIA GPU 计算工具包\ CUDA \ v7.0 \ bin \ nvcc.exe“ -gencode = arch = compute_20,code = \“compute_20,compute_20 \” - use-local-env --cl-version 2013 -ccbin“C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ bin \ x86_amd64“-I./ -I ../../ common / inc -I./ -I“C:\ Program Files \ NVIDIA GPU Computing Toolkit \ CUDA \ v7.0 / include”-I ../../ common / inc -I “C:\ PROGRAM Files \ NVIDIA GPU Computing Toolkit \ CUDA \ v7.0 \包含“-G --keep-dir x64 \ Debug -maxrregcount = 0 --machine 64 -ptx -cudart static -Xcompiler “/ wd 4819” -o data / matrixMul_kernel64.ptx “C:\ ProgramData \ NVIDIA 公司\ CUDA 样品\ V7.0 \ 0_Simple \ matrixMulDrv \ matrixMul_kernel.cu“
这是我的项目CUDA内核编译命令:
E:\ Documents \ visual studio 2012 \ Projects \ ProjectName \ ProjectName>“C:\ Program Files \ NVIDIA GPU 计算工具包\ CUDA \ v7.0 \ bin \ nvcc.exe“ -gencode = arch = compute_20,code = \“sm_20,compute_20 \” - use-local-env --cl-version 2013 -ccbin“C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ bin \ x86_amd64“-I”E:\ Documents \ visual studio 2012 \ Projects \ XXXXXX \ XXXXX \ XXXXX \ include“-I”E:\ Documents \ visual studio 2012 \ Projects \ XXXXX \ XXXXX \ XXXXX \ include“-I”E:\ Documents \ visual studio 2012 \ Projects \ XXXXXXXX \ XXXXXXX \ XXXXXX \ include“ -I“E:\ Documents \ visual studio 2012 \ Projects \ XXXXXXX \ XXXXXX \ XXXXXXX \ include”-I“E:\ Documents \ visual studio 2012 \ Projects \ ProjectName \ ProjectName \ include“ -I“E:\ Documents \ visual studio 2012 \ Projects \ XXXXXXX \ XXXXXX \ XXXXXX \ include”-I“E:\ Documents \ visual studio 2012 \ Projects \ XXXXXX \ XXXXXX \ XXXXXX \ include“ -I“E:\ Documents \ visual studio 2012 \ Projects \ XXXXXXX \ XXXXXX \ XXXXXX \ include”-I“E:\ Documents \ visual studio 2012 \ Projects \ XXXXXX \ XXXXXX \ XXXXXX \ include“-I”C:\ Program Files \ NVIDIA GPU Computing Toolkit \ CUDA \ v7.0 / include“ -I“C:\ ProgramData \ NVIDIA Corporation \ CUDA Samples \ v7.0 \ common \ inc”-I“E:\ Documents \ visual studio 2012 \ Projects \ ProjectName \ ProjectName \ include”-I“C:\ Program Files \ NVIDIA GPU Computing Toolkit \ CUDA \ v7.0 \包含“-I”C:\ Program Files \ NVIDIA GPU Computing Toolkit \ CUDA \ v7.0 \包含“-G --keep-dir x64 \ Debug -maxrregcount = 0 --machine 64 --compile -cudart static -g
-DWIN32 -DWIN32 -DWIN64 -D_DEBUG -D_CONSOLE -D_UNICODE -DUNICODE -Xcompiler“/ EHsc / W3 / nologo / Od / Zi / RTC1 / MTd” -o x64 \ Debug \ skernel.cu.obj “E:\ Documents \ visual studio 2012 \项目\项目名\项目名\ SRC \ skernel.cu“
可以看到matrixMulDrv项目设置为使用此行 data / matrixMul_kernel64.ptx 编译.ptx,而在我的项目中我有 -o x64 \ Debug \ skernel.cu .obj 。但我在两个项目上都有相同的CUDA编译器设置。
答案 0 :(得分:2)
Visual Studio中的CUDA项目可以继承项目级别的编译设置(在这种情况下,它们在Project Properties ... CUDA ... Device中定义)和文件级别(在这种情况下,您可以右键单击提取其属性并在类似位置找到它们的文件。)
该文件可以从全局项目设置继承其设置,也可以替换它们(如果您在文件级别选择)。
当nvcc
编译该文件时,其中一些设置将确定将生成什么类型的输出(因此有效地需要编译开关)。普通的CUDA运行时API项目需要将其模块编译成(“混合”)对象文件(即.o
),但CUDA驱动程序API项目通常需要以.cubin
文件形式的cuda“对象”或一个.ptx
文件。
有一些设置可以修改这一代,例如,要将文件从典型的CUDA运行时API编译切换到典型的驱动程序API编译,您可以从“生成混合对象文件”(--compile)中更改“NVCC编译类型”选项)“to”生成.ptx文件(-ptx)“
如果您在文件级别执行此操作,则需要为需要更改其设置的每个文件执行此操作。