我正在寻找帮助开始涉及CUDA的项目.我的目标是有一个项目,我可以在本机g ++编译器中编译,但使用CUDA代码.我知道我必须在nvcc编译器中编译我的CUDA代码,但根据我的理解,我可以以某种方式将CUDA代码编译成cubin文件或ptx文件.
这是我的问题:
假设如下:
我最近了解了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,我仍然不清楚编译或运行时会发生什么.
在使用nvcc构建时,我仍然不确定如何正确指定代码生成的体系结构.我知道我的二进制文件中嵌入了机器代码和PTX代码,这可以通过控制器开关-code
和-arch
(或两者的结合使用-gencode
)来控制.
现在,根据本除了两种编译器标志也有指定架构方法有两种:sm_XX
和compute_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
?
我正在寻找可以为CPU(使用g ++)和GPU(使用nvcc)编码的最简洁的代码量,其中GPU始终优于CPU.任何类型的算法都是可接受的.
澄清一下:我实际上正在寻找两个简短的代码块,一个用于CPU(在g ++中使用C++),另一个用于GPU(在nvcc中使用C++),GPU优于其中.优选地,以秒或毫秒为单位.最短的代码对可能.
我正在使用 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
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?
... see it all on GodBolt.
so which compilers are right and which compilers are s@#$%e ? :-)
我已经在 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
如何强制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中
我想禁用特定编译器警告nvcc
,特别是
警告:不允许NULL引用
我正在使用的代码使用NULL
引用是其中的一部分#pragma
,因此无法避免.
一个理想的解决方案是nvcc
在我们想要禁用警告的源文件中,但编译器标志也可以,如果存在只关闭有问题的警告.
编辑:5年前我问过这个问题,从那以后就提供了两种不同的解决方案.
下面的@ user2333829提出的第一个是使用NULL
编译器标志来关闭整个文件的警告.
第二个解决方案,通过@cr_dave5年提出的问题被问之后,是一个#pragma
基础的方法,可以让你关闭警告非常有针对性的方式.
多年来感谢您的反馈!
当我在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吗?