10. 执行配置优化 ● 一个 SM中,占用率 = 活动线程束的数量 / 最大可能活动线程束的数量.后者保存在设备属性的  maxThreadsPerMultiProcessor  分量中(GTX1070为例,该值为2048).较高的占用率不代表计算效率很高,但是较低的占用率意味着内存延迟严重,还有改进的空间. ● 寄存器有效性是决定占用率的几个因素之一.寄存器读取比内存读取的延迟低很多,但是寄存器组(register file)数量有限,硬件上被整个 SM 上的所有线程共享,软件上一次只能给一…
0. APOD过程 ● 评估.分析代码运行时间的组成,对瓶颈进行并行化设计.了解需求和约束条件,确定应用程序的加速性能改善的上限. ● 并行化.根据原来的代码,采用一些手段进行并行化,例如使用现有库,或加入一些预处理指令等.同时需要代码重构来暴露它们固有的并行性. ● 优化.并行化完成后,需要通过优化来提高性能.优化可以应用于各个级别,从数据传输到计算到浮点操作序列的微调.分析工具对这一过程非常有用,可以建议开发人员优化工作的下一个策略. ● 部署.将结果与原始期望进行比较.回想一下,初始评估步…
附录 A,CUDA计算设备 附录 B,C语言扩展 ▶ 函数的标识符 ● __device__,__global__ 和 __host__ ● 宏 __CUDA_ARCH__ 可用于区分代码的运行位置. __host__ __device__ void fun() { # // 代码运行于计算能力 6.x 设备 #elif __CUDA_ARCH__ >= 500 // 代码运行于计算能力 5.x 设备 #elif __CUDA_ARCH__ >= 300 // 代码运行于计算能力 3.x 设备…
▶ 图形互操作性,OpenGL 与 Direct3D 相关.(没学过,等待填坑) ▶ 版本号与计算能力 ● 计算能力(Compute Capability)表征了硬件规格,CUDA版本号表征了驱动接口和运行时接口的(软件)规格. ● Driver API 的版本号定义在在驱动头文件中的宏 CUDA_VERSION 中. ● 原文,理解 Driver API 向后兼容以及非向前兼容.This is important, because the driver API is backward comp…
▶ 纹理内存使用 ● 纹理内存使用有两套 API,称为 Object API 和 Reference API .纹理对象(texture object)在运行时被 Object API 创建,同时指定了纹理单元.纹理引用(Tezture Reference)在编译时被 Reference API 创建,但是在运行时才指定纹理单元,并将纹理引用绑定到纹理单元上面去. ● 不同的纹理引用可能绑定到相同或内存上有重叠的的纹理单元上,纹理单元可能是 CUDA 线性内存或CUDA array 的任意部分.…
▶ 动态并行. ● 动态并行直接从 GPU 上创建工作,可以减少主机和设备间数据传输,在设备线程中调整配置.有数据依赖的并行工作可以在内核运行时生成,并利用 GPU 的硬件调度和负载均衡.动态并行要求算法和程序要提前改进,消除递归.不规则的循环.结构或其他不适合并行的情况. ● 动态并行的经典图 ● 主机中 Runtime API 提供了跟踪运行核.流与事件的函数,对主机进程中的所有线程来说 CUDA 对象都是可共享的,但是主机调用的各核函数之间是相互独立的,CUDA 对象不能共享(重叠读写).…
▶ 纹理内存访问补充(见纹理内存博客 http://www.cnblogs.com/cuancuancuanhao/p/7809713.html) ▶ 计算能力 ● 不同计算能力的硬件对计算特性的支持. ● 不同计算能力的硬件技术特性(重要). ● 浮点运算技术标准描述(原文) ■ All compute devices follow the IEEE 754-2008 standard for binary floating-point arithmetic with the followin…
▶ 协作组,要求 cuda ≥ 9.0,一个简单的例子见 http://www.cnblogs.com/cuancuancuanhao/p/7881093.html ● 灵活调节需要进行通讯的线程组合(不一定是线程块或是线程束)的尺寸,在更多粒度上进行线程协作. ● 协作组功能支持 CUDA 的各种并行模式,包括生产者 - 消费者并行(producer-consumer parallelism),机会并行(opportunistic parallelism),全网个同步(global synch…
▶ 线程束表决函数(Warp Vote Functions) ● 用于同一线程束内各线程通信和计算规约指标. // device_functions.h,cc < 9.0 __DEVICE_FUNCTIONS_STATIC_DECL__ int __all(int a) { int result; asm __volatile__("{ \n\t" ".reg .pred \t%%p1; \n\t" ".reg .pred \t%%p2; \n\t&…
▶ 可缓存只读操作(Read-Only Data Cache Load Function),定义在 sm_32_intrinsics.hpp 中.从地址 adress 读取类型为 T 的函数返回,T 可以是 char,short,int,long longunsigned char,unsigned short,unsigned int,unsigned long long,int2,int4,uint2,uint4,float,float2,float4,doubledouble2 . T _…