标签: nvcc

如何编译CUDA代码然后将其链接到C++项目?

我正在寻找帮助开始涉及CUDA的项目.我的目标是有一个项目,我可以在本机g ++编译器中编译,但使用CUDA代码.我知道我必须在nvcc编译器中编译我的CUDA代码,但根据我的理解,我可以以某种方式将CUDA代码编译成cubin文件或ptx文件.

这是我的问题:

  1. 如何使用nvcc编译成cubin文件或ptx文件?我不需要-c或其他东西吗?
  2. 我想使用哪种文件类型?
  3. 有哪些g ++命令可以正确地编译和链接项目?

假设如下:

  1. 我有一个名为"main.cpp"的文件,其中包含一个main函数,包含cuda.h.
  2. 我有另一个名为"cudaFunc.cu"的文件,里面有CUDA代码.比方说,我想添加两个存在于main.cpp中的整数数组.

cuda g++ nvcc

47
推荐指数
3
解决办法
6万
查看次数

在Nvidia的NVCC编译器中使用多个"arch"标志的目的是什么?

我最近了解了NVCC如何为不同的计算架构编译CUDA设备代码.

根据我的理解,当使用NVCC的-gencode选项时,"arch"是程序员应用程序所需的最小计算体系结构,也是NVCC的JIT编译器将编译PTX代码的最小设备计算体系结构.

我也明白-gencode的"code"参数是NVCC完全编译应用程序的计算架构,因此不需要JIT编译.

在检查了各种CUDA项目Makefile之后,我注意到以下情况经常发生:

-gencode arch=compute_20,code=sm_20
-gencode arch=compute_20,code=sm_21
-gencode arch=compute_21,code=sm_21
Run Code Online (Sandbox Code Playgroud)

经过一些阅读,我发现可以在一个二进制文件中编译多个设备架构 - 在本例中为sm_20,sm_21.

我的问题是为什么需要这么多的arch/code对?以上是否使用了"拱"的所有值?

它之间的区别是什么?

-arch compute_20
-code sm_20
-code sm_21
Run Code Online (Sandbox Code Playgroud)

是自动选择"拱形"字段中最早的虚拟架构,还是存在其他一些模糊行为?

我应该注意其他任何编译和运行时行为吗?

我已经阅读了手册http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-compilation,我仍然不清楚编译或运行时会发生什么.

cuda nvcc ptx

35
推荐指数
2
解决办法
2万
查看次数

CUDA:如何使用-arch和-code以及SM vs COMPUTE

在使用nvcc构建时,我仍然不确定如何正确指定代码生成的体系结构.我知道我的二进制文件中嵌入了机器代码和PTX代码,这可以通过控制器开关-code-arch(或两者的结合使用-gencode)来控制.

现在,根据除了两种编译器标志也有指定架构方法有两种:sm_XXcompute_XX,其中compute_XX指的是虚拟和sm_XX一个真正的架构.该标志-arch仅采用虚拟体系结构的标识符(例如compute_XX),而-code标志采用真实和虚拟体系结构的标识符.

该文档指出了-arch指定为其编译输入文件的虚拟体系结构.但是,此PTX代码不会自动编译为机器代码,但这是一个"预处理步骤".

现在,-code应该指定汇编和优化PTX代码的架构.

但是,不清楚哪个PTX或二进制代码将嵌入二进制文件中.例如-arch=compute_30 -code=sm_52,如果我指定,这是否意味着我的代码将首先被编译为功能级别3.0 PTX,之后将创建功能级别5.2的机器代码?什么将被嵌入?

如果我只是说明-code=sm_52会发生什么呢?只嵌入V5.2的机器代码是用V5.2 PTX代码创建的?那有什么区别-code=compute_52

cuda nvcc fat-binaries ptx

32
推荐指数
1
解决办法
2万
查看次数

使用CUDA显示GPU优于CPU的最简单可能示例

我正在寻找可以为CPU(使用g ++)和GPU(使用nvcc)编码的最简洁的代码量,其中GPU始终优于CPU.任何类型的算法都是可接受的.

澄清一下:我实际上正在寻找两个简短的代码块,一个用于CPU(在g ++中使用C++),另一个用于GPU(在nvcc中使用C++),GPU优于其中.优选地,以秒或毫秒为单位.最短的代码对可能.

cuda g++ nvcc

27
推荐指数
3
解决办法
2万
查看次数

如何防止 C++ 猜测第二个模板参数?

我正在使用 C++ 库 ( strf ),其中的某处具有以下代码:

namespace strf {
template <typename ForwardIt>
inline auto range(ForwardIt begin, ForwardIt end) { /* ... */ }

template <typename Range, typename CharT>
inline auto range(const Range& range, const CharT* sep) { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)

现在,我想strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)在我的代码中使用。但是如果我这样做,我会收到以下错误(使用 CUDA 10.1 的 NVCC):

error: more than one instance of overloaded function "strf::range" matches the argument list:
            function template "auto strf::range(ForwardIt, ForwardIt)"
            function template "auto strf::range(const Range &, const CharT *)" …
Run Code Online (Sandbox Code Playgroud)

c++ nvcc overload-resolution c++11 template-argument-deduction

27
推荐指数
2
解决办法
5474
查看次数

Can you `= delete` a templated function on a second declaration?

Consider the following code:

template <typename T> int foo();
template <typename T> int foo() = delete;
Run Code Online (Sandbox Code Playgroud)

is this valid C++11?

  • GCC (9.1) says: Yes!
  • clang (8.0) says: No!
  • nvcc (9.2) says: No!
  • MSVC (19.20) says: Yes! (in C++14 mode, it doesn't support C++11.)

... see it all on GodBolt.

so which compilers are right and which compilers are s@#$%e ? :-)

c++ gcc clang nvcc compiler-bug

18
推荐指数
1
解决办法
590
查看次数

安装 cudatoolkit 时缺少 Nvcc?

我已经在 pytorch 上安装了 cuda

conda install pytorch torchvision cudatoolkit=10.0 -c pytorch
Run Code Online (Sandbox Code Playgroud)

但是,似乎没有安装 nvcc。例如nvcc -V,如果我想使用,我会收到未找到 nvcc 的错误,我应该使用sudo apt install nvidia-cuda-toolkit. Can I do this安装它(我不想只是尝试然后发现它不起作用/弄乱了整个cuda 设置)。这是错误还是预期行为?

我使用的是 Ubuntu 18.04 并且有 cuda 10.2

cuda nvcc anaconda pytorch

18
推荐指数
6
解决办法
2万
查看次数

错误:cuda_runtime.h:没有这样的文件或目录

如何强制gcc在/ usr/cuda/local/include中查找cuda_runtime.h?

我正在尝试使用C包装器编译CUDA应用程序.我正在运行Ubuntu 10.04.

我已使用以下命令成功将我的CUDA应用程序编译为.so:

nvcc -arch=sm_11 -o libtest.so --shared -Xcompiler -fPIC main.cu
Run Code Online (Sandbox Code Playgroud)

当我尝试使用以下命令编译我的c包装器文件时:

gcc -std=c99 -o main -L. -ltest main.c
Run Code Online (Sandbox Code Playgroud)

我收到错误:

error: cuda_runtime.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我已经验证了cuda_runtime.h实际上存在于/ usr/local/cuda/include中

c gcc cuda nvcc

16
推荐指数
3
解决办法
3万
查看次数

如何使用nvcc禁用编译器警告

我想禁用特定编译器警告nvcc,特别是

警告:不允许NULL引用

我正在使用的代码使用NULL引用是其中的一部分#pragma,因此无法避免.

一个理想的解决方案是nvcc在我们想要禁用警告的源文件中,但编译器标志也可以,如果存在只关闭有问题的警告.

编辑:5年前我问过这个问题,从那以后就提供了两种不同的解决方案.

下面的@ user2333829提出的第一个是使用NULL编译器标志来关闭整个文件的警告.

第二个解决方案,通过@cr_dave5年提出的问题被问之后,是一个#pragma基础的方法,可以让你关闭警告非常有针对性的方式.

多年来感谢您的反馈!

cuda pragma compiler-warnings nvcc

16
推荐指数
3
解决办法
7536
查看次数

我可以在Windows7x64(MSVC)和Linux64(GCC4.8.2)的.cu文件(CUDA5.5)中使用C++ 11吗?

当我在Windows7x64(MSVS2012 + Nsight 2.0 + CUDA5.5)中编译包含设计C++ 11的以下代码时,我没有得到错误,并且所有内容都编译并运行良好:

#include <thrust/device_vector.h>

int main() {
    thrust::device_vector<int> dv(10);
    auto iter = dv.begin();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在Linux64(Debian 7 Wheezey + Nsight Eclipse,来自CUDA5.5)下编译它时,我得到错误:

../src/CudaCpp11.cu(5):错误:缺少显式类型(假设为"int")

../src/CudaCpp11.cu(5):错误:没有合适的转换函数

"thrust :: detail :: normal_iterator>"到"int"存在

在编译"/tmp/tmpxft_00001520_00000000-6_CudaCpp11.cpp1.ii"中检测到2个错误.make:* [src/CudaCpp11.o]错误2

当我添加行:-stdc ++ 11

在Properties-> Build-> Settings-> Tool Settings-> Build Stages-> Preprocessor options(-Xcompiler)中

我收到更多错误:

/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h(432):错误:标识符"nullptr"未定义

/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h(432):错误:预期";"

...

/usr/include/c++/4.8/bits/cpp_type_traits.h(314):错误:命名空间"std :: __ gnu_cxx"没有成员

"__normal_iterator"

/usr/include/c++/4.8/bits/cpp_type_traits.h(314):错误:预期">"

nvcc错误:'cudafe'因信号11(无效内存引用)而死亡:* [src/CudaCpp11.o]错误11

只有当我thrust::device_vector<int>::iterator iter = dv.begin();在Linux-GCC中使用时,我才会收到错误.但在Windows MSVS2012中,所有c ++ 11功能都可以正常工作!

我可以在Windows7x64(MSVC)和Linux64(GCC4.8.2)的.cu文件(CUDA5.5)中使用C++ 11吗?

gcc cuda nvidia nvcc c++11

16
推荐指数
1
解决办法
5991
查看次数