精华内容
下载资源
问答
  • (确保cuda include目录位于包含路径上,库路径中的库,如果使用nvcc编译,库路径将自动处理)。 Update The proper way to set the c++ standard for more recent versions of CMake is explained here: Triggering ...

    I have an opencv c++ script and I need to use cudamemcpy in it. So I used cudamemcpy in my script and saved the file as a .cu I am using cmake. So I added the .cu as a cuda_executable. But when I use "sudo make" I get the following error

    我有一个opencv c++脚本,我需要在其中使用cudamemcpy。因此,我在脚本中使用cudamemcpy,并将文件保存为.cu,使用cmake。因此我将.cu添加为cuda_可执行文件。但是当我使用“sudo make”时,会得到以下错误

    aHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9mcjF3Zi5wbmc=

    This is the makefile aHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9FY2pQVS5wbmc=

    这是makefile

    So in line 27 I changed c++0x to c++11 and I got the same error so I tried gnu++11 but I still have the same error.

    在第27行,我把c++0x改成了c++11我得到了同样的错误所以我尝试了gnu+ 11但是我还是有同样的错误。

    1 个解决方案

    #1

    4

    The problem is that -std=c++11 is not added to the nvcc build command if it is passed via add_definitions(). From the FindCUDA cmake documentation:

    问题是,如果通过add_definition()传递-std=c++11,则不会添加到nvcc构建命令中。从FindCUDA cmake文档:

    Flags passed into add_definitions with -D or /D are passed along to nvcc.

    用-D或/D传递给add_definition的标志被传递给nvcc。

    Other options like -std=c++11 are not passed to nvcc.

    其他选项如-std=c++11不会传递给nvcc。

    You can enable c++11 globally by adding it to the CUDA_NVCC_FLAGS

    您可以通过将它添加到CUDA_NVCC_FLAGS来全局启用c++11

    set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -std=c++11" )

    Or on a per target level with

    或者在目标水平上

    cuda_add_executable(opencv opencv.cu OPTIONS -std=c++11)

    As talonmies pointed out in the comment: if you only need functions from the runtime API, like cudaMemcpy(), you can use them in ordinary C++-files (no .cu extension required). Then, you need to include cuda_runtime_api.h and link to the cuda runtime library cudart. (Ensure that the cuda include directory is on your include-path and the library in your library path, which is automatically taken care of if you used nvcc to compile.)

    正如talonmies在注释中指出的:如果您只需要运行时API中的函数,比如cudaMemcpy(),那么您可以在普通的c++文件中使用它们(不需要.cu扩展)。然后,需要包含cuda_runtime_api。h和链接到cuda运行时库cudart。(确保cuda include目录位于包含路径上,库路径中的库,如果使用nvcc编译,库路径将自动处理)。

    Update

    The proper way to set the c++ standard for more recent versions of CMake is explained here: Triggering C++11 support in NVCC with CMake

    本文解释了为最新版本的CMake设置c++标准的正确方法:使用CMake在NVCC中触发c++ 11支持

    展开全文
  • CUDA以及NVCC编译流程

    万次阅读 2017-05-18 12:50:20
    NVCC编译流程

    文章转载自:
    http://chenrudan.github.io/

    在安装CUDA的时候,会安装三个大的组件[1],分别是NVIDIA驱动、toolkit和samples。驱动用来控制gpu硬件,toolkit里面包括nvcc编译器、Nsight调试工具(支持Eclipse和VS,linux用cuda-gdb)、分析和调试工具和函数库。samples或者说SDK,里面包括很多样例程序包括查询设备、带宽测试等等。

    1. Runtime API vs Driver API

    在写cuda程序时,除了自己写的kernel函数,常常会调用cuda接口函数,最常见的就是全局内存分配函数cudaMalloc(),这里分配的内存暂且理解为gpu硬件参数上的显存。然而在某种情况下可能会看到另外一个函数cuMemAlloc(),这两个函数本质上完成的功能是一样的,都是在分配全局内存,但却属于两套接口,分别为Runtime API和Driver API。下图是cuda软件层的一些组件,实际上在cuda的软件层面,Runtime比Driver API更高级,封装的更好,在Runtime之上就是封装的更好的cuFFT等库。这两个库的函数都是能直接调用的,但Driver API相对于Runtime对底层硬件驱动的控制会更直接更方便,比如对context的控制[2],Driver API调用硬件速度实际上比Runtime也快不了多少。不过Driver API向后兼容支持老版本的,这点Runtime就做不到,7.0的版本代码可能在6.5上就跑不了。大部分的功能两组API都有对应的实现,一般基于Driver API的开头会是cu,而基于Runtime API的开头是cuda,但基于Driver API来写程序会比Runtime API要复杂,虽然功能上差别不大,但是使用Runtime API和更高级的库函数就已经足够了。

    2. 常用函数库
    NVIDIA针对cuda的使用开发了很多好用的库,包括实现c++ STL的thrust、实现gpu版本blas的cublas、实现快速傅里叶变换的cuFFT、实现稀疏矩阵运算操作的cuSparse以及实现深度学习网络加速的cuDNN等等。在操作这些库时有一个通用的规范,即调用者进行设备内存的分配与释放,内存分配好后将指针传递给这些库接口,就可以进行计算了。

    关于thrust,它最基本的数据类型是两个向量容器,host_vetcor和device_vector,分别对应了内存分配在cpu内存和cpu内存,并且提供了非常多的函数模板,例如归约、归并、排序、二分查找等等。此外支持很多STL容器,例如下面的例子(代码来源[4])中即可以从c++容器中将数据复制给thrust的vector,也能将thrust的数据复制给c++ stl。

    std::list<int> stl_list;
    stl_list.push_back(10);
    stl_list.push_back(20);
    stl_list.push_back(30);
    stl_list.push_back(40);
    
    
    // 从c++ stl的list来初始化device_vector 
    thrust::device_vector<int> D(stl_list.begin(), stl_list.end()); 
    
    // 将device_vector的内容复制到stl的vector中 
    std::vector<int> stl_vector(D.size()); 
    thrust::copy(D.begin(), D.end(), stl_vector.begin());

    而cublas的接口设计基本上跟blas库是一致的,也是有lever1~3的接口,不同点在cuda的库风格是在使用相关函数之前要创建一个句柄,这个句柄也要传递到相关函数中去,在程序完成之后要销毁对应的句柄。因此cublas库函数原型比blas的参数要多。句柄的设置是为了方便执行多gpu,即在通过调用cudaSetDevice()来启用不同的gpu设备,在每个设备上又可以初始化一个独立的句柄,那么就能同时在多个gpu上执行。虽然cuda允许不同的线程调用同一个句柄,但是最好还是不要这样做。

    至于cudnn,它是专门针对深度学习实现的一个库,目前主要还是实现卷积神经网络,加速效果很好,现在的一些深度学习框架基本上都支持它。

    3. NVCC编译流程

    由于程序是要经过编译器编程成可执行的二进制文件,而cuda程序有两种代码,一种是运行在cpu上的host代码,一种是运行在gpu上的device代码,所以NVCC编译器要保证两部分代码能够编译成二进制文件在不同的机器上执行。nvcc涉及到的文件后缀及相关意义如下表[5]。

    这里写图片描述

    此外编译的常用选项还有–link,编译并链接所有的输入文件,–run编译链接文件后直接执行,-m指定32位还是64位机器。

    有时还会见到–gpu-architecture/-arch和–gpu-code/-code,它们的目标是为了让gpu代码能够兼容多种架构的gpu,它们的取值范围是一样的包括compute_10/compute_11/…/compute_30/compute_35/sm_10/sm_11/…/sm_30/sm_35,这些取值范围的意义实际上是指gpu的计算能力,或者是SM的版本,一般表示的是1.0/2.0/3.5这样的,具体体现在之前讲过的kepler/fermi的不同架构,所以两者实际含义是一样的(这里看[5]上表达应该是两者等价,但是为什么要搞两个,统一叫计算能力不行吗…)。而这里两个编译选项都要选择计算能力/sm版本,这是因为nvcc最后生成的可执行文件可以同时存在多个版本(对应compute_10/…/compute_35等)的kernel函数,这多个版本就通过这两个编译选项确定。这两个编译选项使得中间会生成的ptx文本文件和cubin二进制文件,它们指定了最后生成的可执行文件中可以满足的版本要求,即通过-arch指定ptx将来可以生成怎么样的版本(可以看成针对一个虚拟的gpu),而-code参数是指当前就要生成的二进制的版本(可以想象成一个真实的GPU),当前和将来的意思是指,最后生成的可执行文件中一个部分是马上就能在gpu上执行,而如果gpu硬件版本不支持这个能够马上执行的部分,那么显卡驱动会重新根据ptx指定的版本再生成一个能够执行的可执行版本,来满足这个gpu的硬件需求。它们的版本信息会先嵌入fatbin文件中,再通过fatbin与host代码编译生成的中间结果链接成最后的目标文件,这是针对一个.cu源文件生成一个.o文件,再将不同.o链接成可执行文件,那么这个可执行文件中就包含了多个版本的信息。假如取–arch=compute_10 –code=sm_13,在最后的可执行文件中,就有一个可以直接执行1.3的版本,假如此时gpu计算能力只有1.0,那么驱动会再次编译生成1.0版本的可执行文件,这个新的可执行文件就能在计算能力只有1.0的机器上运行了,从而通过这样的方式可以兼容不同计算能力的gpu。需要注意的是code的版本要高于arch。

    显然这里有一个问题,一般而言生成的c++可执行程序就直接执行了,不会再有编译的过程,但是cuda不一样,它有一个机制叫做just-in-time(JIT,运行时编译),为了满足两种执行cuda程序的方式。第一种就是直接执行cubin版本,第二种就是显卡驱动通过JIT在运行的时候根据ptx版本再次编译生成可执行文件。

    NVCC实际上调用了很多工具来完成编译步骤。在编译一个.cu源文件时,当输入下面的指令后,执行程序就会将整个编译过程都打印出来。cuda的整个编译流程分成两个分支,分支1预处理device代码并进行编译生成cubin或者ptx,然后整合到二进制文件fatbin中,分支2预处理host代码,再和fatbin一起生成目标文件。

    nvcc --cuda test.cu -keep --dryrun

    针对打印出来的每个过程中生成的文件做一个简单的分析,test.cu初始化一个runtime的硬件查询对象cudaDeviceProp,然后打印共享内存的大小。这里打印出来的内容只截取了每条命令的部分,主要给出中间的生成文件。

    //打印信息
    gcc -D__CUDA_ARCH__=200 -E -x c++ ... -o "test.cpp1.ii" "test.cu"

    上面这一步是device代码预处理,它将一些定义好的枚举变量(例如cudaError)、struct(例如cuda的数据类型float4)、静态内联函数、extern “c++”和extern的函数、还重新定义了std命名空间、函数模板等内容写在main函数之前。

    cudafe ... --gen_c_file_name "test.cudafe1.c" --gen_device_file_name "test.cudafe1.gpu" ...

    这一步test.cpp1.ii被cudafe切分成了c/c++ host代码和.gpu结尾的device代码,其中main函数还是在.c结尾的文件中。

    gcc -D__CUDA_ARCH__=200 -E -x c ... -o "test.cpp2.i" "test.cudafe1.gpu"
    cudafe ... --gen_c_file_name "test.cudafe2.c" ... --gen_device_file_name "test.cudafe2.gpu"
    gcc -D__CUDA_ARCH__=200 -E -x c ... -o "test.cpp3.i" "test.cudafe2.gpu"
    filehash -s "test.cpp3.i" > "test.hash"
    gcc -E -x c++ ... -o "test.cpp4.ii" "test.cu"
    cudafe++ ... --gen_c_file_name "test.cudafe1.cpp" --stub_file_name "test.cudafe1.stub.c"

    上面这段生成的test.cpp4.ii是在对host代码进行预处理,前面几行内容直接看文件有点看不出来,希望以后能够把这段补充起来。

    cicc  -arch compute_20 ... --orig_src_file_name "test.cu" "test.cpp3.i" -o "test.ptx"
    ----------------
    test.ptx:
        .version 4.1
        .target sm_20
        .address_size 64
    ----------------
    test.cpp1.ii
        ".../include/sm_11_atomic_functions.h"
        ...
        ".../include/sm_12_atomic_functions.h"
        ...
        ".../include/sm_35_atomic_functions.h"

    test.ptx文件中只记录了三行编译信息,可以看出对应了上面提到指定ptx的版本,以后可以根据这个版本再进行编译。实际上在host c++代码即每一个test.cpp*文件中,都包含了所有版本的SM头文件,从而可以调用每一种版本的函数进行编译。

    ptxas -arch=sm_20 -m64  "test.ptx" -o "test.sm_20.cubin"

    这一步叫做PTX离线编译,主要的目的是为了将代码编译成一个确定的计算能力和SM版本,对应的版本信息保存在cubin中。

    fatbinary --create="test.fatbin" ... "file=test.sm_20.cubin" ... "file=test.ptx" --embedded-fatbin="test.fatbin.c" --cuda

    这一步叫PTX在线编译,是将cubin和ptx中的版本信息保存在fatbin中。这里针对一个.cu源文件,调用系统的gcc/g++将host代码和fatbin编译成对应的目标文件。最后用c++编译器将目标文件链接起来生成可执行文件。

    4. 个人补充:
    常见版本差异列举:

    sm_20 (deprecated) | Basic features + Fermi support

    sm_30 and sm_32 | + Kepler support + Unified memory programming

    sm_35 | + Dynamic parallelism support sm_50, sm_52, and sm_53 + Maxwell support

    NVCC编译中PTX code是为了增加版本兼容性,所以有种说法是PTX生成版本越低越好,Binary 生成版本越高越好。这样兼容的跨度就最大。但这个跨度也仅限于同一代架构中,这种兼容性是指,X.Y的code可以兼容X.Z的code,其中Z>=Y.
    PTX大致流程如下:
    这里写图片描述

    Read more at: http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#ixzz4hP0KVTbA
    Follow us: @GPUComputing on Twitter | NVIDIA on Facebook

    展开全文
  • nvcc编译

    千次阅读 2019-03-10 23:30:26
    阶段性编译命令 下面说的名字是没有使用–outputfile指明生成文件名的时候,按照默认生成的。 阶段 编译器 擦参数 输入文件 默认文件名 .cu文件编译成c/c++文件 nvcc –cuda -...

    文件后缀说明

    后缀名Description说明
    .cuCUDA source file, containing host code and device functionscuda源文件
    .cC source filec源文件
    .cc, .cxx, .cppC++ source fileC++源文件
    .ptxPTX intermediate assembly file中间汇编文件
    .cubinCUDA device code binary file (CUBIN) for a single GPU architecture包括一个GPU构架的设备二进制文件
    .fatbinCUDA fat binary file that may contain multiple PTX and CUBIN files多个PTX和CUBIN的二进制文件
    .o.obj Object file目标文件
    .a,.lib Library file库文件
    .resResource file资源文件
    .soShared object file动态库文件

    编译步骤

    在这里插入图片描述

    常用命令说明

    阶段性编译命令

    下面说的名字是没有使用–outputfile指明生成文件名的时候,按照默认生成的。

    阶段编译器擦参数输入文件默认文件名
    .cu文件编译成c/c++文件nvcc–cuda
    -cuda
    x.cux.cu.cpp.ii.
    C/C++ 预处理–preprocess
    -E
    标准输出
    C/C++ 编译成目标文件–compile
    -c
    x.o
    cuda原文件生成cubin–cubin
    -cubin
    x.cux.cubin
    ptx文件生成cubin–cubin
    -cubin
    x.ptxx.cubin
    cu文件生成ptx–ptx
    -ptx
    x.cux.ptx
    cu,ptx,cubin文件生成fatbinary–fatbin
    -fatbin
    x.fatbin
    可链接设备代码生成–device-link
    -dlink
    a_dlink.o
    cubin从可链接设备代码生成–device-link–cubin
    -dlink-cubin
    a_dlink.cubin
    fatbinary从可链接设备代码生成–device-link–fatbin
    -dlink-fatbin
    a_dlink.fatbin
    生成可执行文件a.out
    生成库文件–lib
    -lib
    a.lib
    make dependency generation–generate-dependencies
    -M
    标准输出
    make dependency generation without headers in system paths–generate-nonsystem-dependencies
    -MM
    标准输出
    Running an executable–run
    -run

    参考链接:https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#options-for-steering-gpu-code-generation

    展开全文
  • nvcc编译目标GPU指令集的命令选项

    -arch: 

        指定nvcc编译目标GPU的型号,可以为“real” GPU,也可以为“virtual” PTX架构

        这个选项指定了nvcc编译到PTX阶段的目标架构,而-code选项指定了nvcc最后阶段生成的运行时代码的目标架构。现阶段支持的架构类型有:virtual 架构 compute_10, compute_11, compute_12, compute_13和实现这些虚架构的real GPU sm_10, sm_11, sm_12, sm_13.


    -code: 

        指定nvcc生成目标代码的目标GPU,支持的架构类型与-arch一样,都可以是“real”或“virtual”。

        除非指定了--export-dir,nvcc在可执行代码中为-code选项指定的每个目标GPU生成一块编译好的可加载二进制代码副本。在运行时,如果没有找到可加载二进制代码,嵌入的ptx代码会由CUDA运行时系统根据动态地编译成“current” CPU。

        当使用了-code选项时,-arch选项指定的必须是“virtual”架构。如果没有指定-code选项,那么它的缺省值就是-arch选项的值。

    展开全文
  • CUDA编译(一)---使用nvcc编译cuda

    万次阅读 热门讨论 2018-02-07 18:08:55
    CUDA编译(一)—使用nvcc编译cuda nvcc介绍 示例 nvcc介绍 nvcc是编译cuda程序的编译器,CDUA C是在C语言上的扩展,所以它依赖C编译器(C编译器在window下是cl.exe,在Linux下是gcc)。因此我们编译CUDA程序...
  • CUDA:nvcc编译参数示例

    千次阅读 2018-05-26 17:00:50
    CUDA:nvcc编译参数示例 前言 nvcc中有控制程序兼容性的参数,本节主要讲这些参数,如果对原理想有了解见CUDA:NVCC编译过程和兼容性详解 CMake中的参数写法和命令行的写法都有。 多种编译写法 虚拟架构+真实...
  • CUDA nvcc编译步骤简单讲解

    千次阅读 2017-08-21 10:53:21
    如果你想了解 Nvcc 到底搞了什么鬼,究竟 compute_xy sm_xy 区别在哪里, ptx,cudabin 又是怎么嵌套到 exe 里面最终被驱动执行的,这一节正是你想要的知识。他将讲解每一个编译的具体步骤,而且不光是知识,...
  • CUDA:NVCC编译过程和兼容性详解 https://codeyarns.com/2014/03/03/how-to-specify-architecture-to-compile-cuda-code/ https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#supported-phases ...
  • CUDA:NVCC编译过程和兼容性详解

    万次阅读 多人点赞 2018-05-26 16:29:49
    CUDA:NVCC编译过程和兼容性详解 https://codeyarns.com/2014/03/03/how-to-specify-architecture-to-compile-cuda-code/ https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#supported-phases ...
  • NVCC Command Options(NVCC命令编译选项)

    千次阅读 2015-12-22 09:59:21
    Nvcc recognizes three types of command options: boolean (flag-) options, single value options, and list (multivalued-) options. Boolean options do not have an argument: they are either specified on...
  • 如果cuda程序没有使用动态并行,编译动态链接库为:nvcc -arch=sm_60 -std=c+11 -O3 -rdc=true -Xcompiler -fPIC -c algorithm.cu -o algorithm.og++ algorithm.o -fPIC -shared -o libalgorithm.socuda文件中如果...
  • usr/local/cuda/include目录里面已经有thrust包了 nvcc --version命令也通过 为何编译时候还是会报no such file kernel.cu:7:34: fatal error: thrust\device_vector.h: No such file or directory
  • nvcc编译过程第一篇:https://blog.csdn.net/shungry/article/details/89715468 正文:编译流程(补充) 以我mytest.cu为例子,输入以下命令: nvcc --cuda .\mytest.cu -keep 先解释里面命令的含义, --cuda/...
  • 写了一个简单的测试程序,使用nvcc编译,指令如下: nvcc cudaPrintDeviceInfo.cu -o cudaPrintDeviceInfo 本以为会很顺利地生成执行文件。但还是出现了warning: nvcc warning : The 'compute_20', 'sm_20', and '
  • nvcc quicksort_ex.cu -o quicksort_ex -Xcompiler “-fopenmp”
  • NVCC CUDA编译流程

    万次阅读 2016-09-25 08:24:29
    NVCC CUDA编译流程 (2012-09-23 17:00:13) 转载▼ 标签: 杂谈 分类: CUDA学习 一、CUDA编译流程简介 Nvcc是一种编译器驱动,通过命令行选项可以在不同阶段启动不同的工具完成...
  • CUDA学习(一)-NVCC编译过程

    千次阅读 2019-05-07 16:43:29
    NVCC编译过程分为离线编译和即时编译两部分组成: 离线编译(绿色虚线框内): CUDA源程序(即xxx.cu文件)在编译前的预处理会被分为主机端代码和设备段代码(即图中的左右分支): 1.如图右分支:在设备端代码...
  • nvcc编译过程第一篇:https://blog.csdn.net/shungry/article/details/89715468 nvcc编译过程第二篇:https://blog.csdn.net/shungry/article/details/89788342 正文: nvcc的分散编译必须在CUDA5.0版本之后才...
  • NVCC

    千次阅读 2018-12-06 23:49:25
    -arth, --gpu-arthitecture 定义用于编译的虚拟架构  描述编译CUDA输入文件的NVIDIA虚拟GPU架构类别。排除速写的情况,该选项描述的架构必须是虚拟架构(例如,compute... 在简单NVCC编译的情况下,支持速写:如...
  • MPI+CUDA混合程序的编译命令

    千次阅读 2014-02-26 11:52:15
    单独的MPI程序和CUDA程序的编译命令是很简单的。 MPI程序的编译命令为: mpicc test.c -o test CUDA程序的编译命令为: nvcc test.c test_cuda.cu -o test 但是MPI+CUDA混合程序的编译命令就没这么简单了,下面举例...
  • 对于CUDA 10.1,此配置行不再正确: nvcc_compile_args = ['-O', '--ptxas-...这将生成一个nvcc编译命令,如下所示: nvcc -O ... 在CUDA 10.0及更低版本中,此命令是合法的。 对于CUDA 10.1则不是。 此开关通...
  • 编译命令

    2012-04-07 14:31:41
    编译三个.c文件: gcc initapi.c randapi.c test.o -o test 编译成可执行映像 编译成库的形式: gcc -c -Wall initapi.c (-c 表示只编译不链接,-Wall打开全部警告设置) gcc -c -Wall randapi.c ar -cru ...
  • CUDA文件编译命令

    千次阅读 2008-02-24 12:39:00
    CUDA文件编译命令行2008-02-18 13:11EmuDebug:$(CUDA_BIN_PATH)/nvcc.exe -ccbin "$(VCInstallDir)bin" -deviceemu -c -D_DEBUG -DWIN32 -D_CONSOLE -D_MBCS -Xcompiler /EHsc,/W3,/nologo,/Wp64,/Od,/Zi,/RTC1,/
  • nvcc简介

    千次阅读 2020-05-03 22:47:50
    nvcc编译分成device部分编译和host部分编译,host部分直接调用平台编译器进行编译Linux使用gcc,window使用cl.exe,这里主要讲解device部分的编译,此部分编译分两个阶段,第一阶段将源文件.cu文件的device部分编译...
  • Linux下c和cuda混合编译nvcc选项

    千次阅读 2018-01-29 14:12:39
    在linux下将c和cuda进行混合编程时,我先将程序编译成可执行文件,发现可疑正常运行,但是重新建了一个c++ lib工程后,发现报错,报错信息为relocation R_X86_64_32against '....解决方案是在用nvcc编译.cu文件时需要

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,641
精华内容 1,456
关键字:

nvcc编译命令