● nvcc 编译流程图

● sm 是向前兼容的,高的版本号是在低版本号的基础上添加了新功能得到的,同一 compute_XY 编译的 .cu 文件仅能向后 sm_ZW 的实 GPU 版本(Z > X)

● 虚拟 GPU 完全由它提供给应用程序的一组功能或特征来定义

● PTX 可以视为虚拟 GPU 的 汇编,以文本格式表示,便于进一步编译为各格式的二进制机器码

● 编译时应尽量降低虚拟 GPU 版本(增加兼容性),同时尽量提高实际 GPU 版本(在知道运行 GPU 的情况下)

● 即时编译(JIT)模式下驱动知道 runtime GPU 的信息,可以编译最佳版本的代码,离线编译和 JIT 的流程图分别如下:

● 仅指定虚 GPU 版本而不指定实 GPU 版本时(如 nvcc x.cu -arch=compute_50 [-code=compute_50]),PTX 将延迟到运行时才进行编译,有启动延迟

● 消灭启动延迟的方法:

  ■ CUDA 驱动编译缓存

  ■ 编译时指定多个实 GPU 版本(如 nvcc x.cu -arch=compute_50 -code=sm_50,sm_52),设备函数的多个版本存储在 x.fatbin 中,运行时由驱动自动识别和调用

● 关于 -arch 和 -code 的要点

  ■ 仅指定 -arch 为虚 GPU 版本,-code 自动匹配最接近的版本(如 nvcc x.cu -arch=compute_50 等价于 nvcc x.cu -arch=compute_50 -code=compute_50)

  ■ 仅指定 -arch 为实 GPU 版本,-code 自动匹配最接近的版本(如 nvcc x.cu -arch=sm_50 等价于 nvcc x.cu -arch=compute_50 -code=sm_50,compute_50)

  ■ 同时指定 -arch 和 -code 为虚 GPU 版本,必须一致

  ■ 均不指定,使用默认值(如 nvcc x.cu 等价于 nvcc x.cu -arch=compute_30 -code=)

  ■ 默认 -arch 值就是 sm_XX

  ■ 编译第一阶段中有宏定义 __CUDA_ARCH__ 代表虚 GPU 版本,可用于 __device__ 函数中,用于指明该函数所用的虚 GPU 版本

● 没有指定 --keep 时 nvcc 使用临时目录来保存中间文件,编译完成后立即删除,Windows 中使用环境变量 TEMP 或默认目录 C:\Windows\temp,Linux 使用环境变量 TMPDIR 或默认目录 /tmp

● CUDA 5.0 开始支持分离编译,流程图如下。

■ 自己在电脑上实验分离编译,VS中能通过,gcc 中没有成功,编译过程没有问题,运行时提示 couldn't get the symbol addr,留坑。

 //---------- b.h ----------
#define N 8
extern __device__ int g[N];
extern __device__ void bar(void); //---------- b.cu ----------
#include "b.h"
__device__ int g[N];
__device__ void bar(void)
{
g[threadIdx.x]++;
} //---------- a.cu ----------
#include <stdio.h>
#include "b.h"
__global__ void foo(void)
{
__shared__ int a[N];
a[threadIdx.x] = threadIdx.x;
__syncthreads();
g[threadIdx.x] = a[blockDim.x - threadIdx.x - ];
bar();
} int main(void)
{
unsigned int i;
int *dg, hg[N];
int sum = ;
foo << <, N >> >();
if (cudaGetSymbolAddress((void**)&dg, g))
{
printf("couldn't get the symbol addr\n");
return ;
}
if (cudaMemcpy(hg, dg, N * sizeof(int), cudaMemcpyDeviceToHost))
{
printf("couldn't memcpy\n");
return ;
}
for (i = ; i < N; i++)
sum += hg[i];
if (sum == )
printf("PASSED\n");
else
printf("FAILED (%d)\n", sum);
return ;
}

■ 书上用到的编译命令

nvcc --gpu-architecture=sm_50 --device-c a.cu b.cu
nvcc --gpu-architecture=sm_50 a.o b.o nvcc --gpu-architecture=sm_50 --device-c a.cu b.cu
nvcc --gpu-architecture=sm_50 --device-link a.o b.o --output-file link.o
g++ a.o b.o link.o --library-path=<path> --library=cudart nvcc --gpu-architecture=sm_50 --device-link a.o b.o --cubin --output-file link.cubin nvcc --gpu-architecture=sm_50 --device-c a.cu b.cu
nvcc --lib a.o b.o --output-file test.a
nvcc --gpu-architecture=sm_50 test.a nvcc --gpu-architecture=sm_50 --device-c a.ptx nvcc --gpu-architecture=sm_50 --device-c a.cu b.cu
nvcc --gpu-architecture=sm_50 --device-link a.o b.o --output-file link.o
nvcc --lib --output-file libgpu.a a.o b.o link.o
g++ host.o --library=gpu --library-path=<path> --library=cudadevrt --library=cudart

CUDA compiler driver nvcc 散点 part 2的更多相关文章

  1. CUDA compiler driver nvcc 散点 part 1

    ▶ 参考[https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html] ▶ nvcc 预定义的宏 __NVCC__ // 编译 ...

  2. 显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn到底是什么?

    在使用深度学习框架的过程中一定会经常碰到这些东西,虽然anaconda有时会帮助我们自动地解决这些设置,但是有些特殊的库却还是需要我们手动配置环境,但是我对标题上的这些名词其实并不十分清楚,所以老是被 ...

  3. centos7.0安装cuda驱动

    00.CUDA简介 CUDA和GPU的并行处理能力来加速深度学习和其他计算密集型应用程序 01.CPU+GPU协同架构 02.部署环境 [docker@lab-250 ~]$ cat /etc/*re ...

  4. cuda cudnn anaconda gcc tensorflow 安装及环境配置

    1.首先,默认你已经装了适合你的显卡的nvidia驱动. 到  http://www.nvidia.com/Download/index.aspx 搜索你的显卡需要的驱动型号 那么接下来就是cuda的 ...

  5. [笔记] Ubuntu 18.04安装cuda 10及cudnn 7流程

    安装环境 OS:Ubuntu 18.04 64 bit 显卡:NVidia GTX 1080 任务:安装 CUDA 10及cuDNN 7 工具下载 NVidia官网下载下列文件: CUDA 10:cu ...

  6. Jetson tx1 安装cuda错误

    前两天安装Jetpack3.0的时候,看着网上的教程以为cuda会自动安装上,但是历经好几次安装,都安装不上cuda,也刷了好几次jetpack包.搜遍了网上的教程,也没有安装上.错误如下图所示: 这 ...

  7. 记录下自己安装cuda以及cudnn

    之前已经装过一次了,不过没有做记录,现在又要翻一堆博客安装,长点记性,自己记录下. 环境 ubuntu16.04 python2.7 商家送过来时候已经装好了显卡驱动,所以省去了一大麻烦. 剩下的就是 ...

  8. Caffe+Kubuntu16.04_X64+CUDA 8.0配置

    前言: 经过尝试过几次Caffe,theano,MxNet之后,很长时间没有进行caffe的更新,此次在Ubuntu16.04下安装Caffe,折腾了一天时间,终于安装成功. 参考链接:Caffe+U ...

  9. 安装CUDA和cuDNN

    GPU和CPU区别 1,CPU主要用于处理通用逻辑,以及各种中断事物 2,GPU主要用于计算密集型程序,可并行运作: NVIDIA 的 GeForce 显示卡系列采用 GPU 特性进行快速计算,渲染电 ...

随机推荐

  1. cordova本地浮动框提示插件使用:cordova-plugin-x-toast

    1. 添加插件:cordova plugin add cordova-plugin-x-toast 2. 调用方法(浮动提示插件,弹出本地浮动提示框): $cordovaToast.show(mess ...

  2. MySQL数据库使用规范

    一.建表规约 1.[强制]表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint (1表示是,0表示否) 说明:任何字段如果为非负数,必须是unsigned ...

  3. 2018-2019-2 20175207 实验一《JAVA开发环境的熟悉》实验报告

    目录 使用JDK编译运行简单程序 使用IDEA对程序进行调试 实验练习 产生一个随机数,让用户猜测,猜错了告诉用户是大了还是小了. 并进行测试(正常情况,异常情况,边界情况) 实验总结 使用IDEA编 ...

  4. Linux updatedb命令详解

    Linux updatedb命令 updatedb 命令用来创建或更新 locate 命令所必需的数据库文件. updatedb 命令的执行过程较长,因为在执行时它会遍历整个系统的目录树,并将所有的文 ...

  5. GCD学习

    出自简书 : https://www.jianshu.com/p/2d57c72016c6 在 GCD 中有两种队列:串行队列和并发队列.两者都符合 FIFO(先进先出)的原则.两者的主要区别是:执行 ...

  6. python3-基础7

    协程函数 面向过程编程 递归与二分法 内置函数   lambda 模块与包的使用 import from ... import ... 常用模块 ########################### ...

  7. function "round" declared implicitly

    keil工程代码,浮点计算中引用了数学库 math.h 中的round函数,但编译时出现告警 “warning:  #223-D: function "round" declare ...

  8. MVC object htmlAttributes,IDictionary<string, object> htmlAttributes 写法

    MVC object htmlAttributes:new {style="color:red",width="12px",height="10px& ...

  9. 实验楼Python破解验证码

    本人大二,因为Python结业考试项目,又想要学习机器学习方向,但是由于接触时间不长,选择了实验楼的Python破解验证码这个项目作为我的项目, 我在原来的基础上加了一些代码用于完善,并且对功能如何实 ...

  10. 学习笔记《Java多线程编程实战指南》一

    1.1什么是多线程编程 多线程编程就是以线程为基本抽象单位的一种编程范式,和面向对象编程是可以相容的,事实上Java平台中的一个线程就是一个对象.多线程编程不是线程越多越好,就像“和尚挑水”的故事一样 ...