GPU编程 线程配置

13 篇文章 8 订阅

1.线程的组成结构

具体的结构从上至下可以分为:Grid-> Block-> Warp ->thread。

Grid/Block/Warp/Thread都是软件的组织结构,并不是硬件的,因此理论上我们可以以任意的维度(一维、二维、三维)去排列Thread;在硬件上就是一个个的SP,并没有维度这一说,只是软件上抽象成了具有维度的概念。

Warp是结构中的第三个层次,32个线程为一组。

在这里插入图片描述

2.确定自己显卡的配置

在进行程序设计前要注意显卡所支持的thread数量和block数量是有限制的。因此首先要对显卡的配置进行确认。否则一旦程序超过了显卡的硬件限制,便会停止工作。

打印显卡配置的cuda例程:

/***
 *打印显卡属性
 *2017-11-8
 * ***/

#include<iostream>
#include <cuda_runtime.h>
#include<device_launch_parameters.h>

using namespace std;

int main()
{
	int deviceCount;

	cudaGetDeviceCount(&deviceCount);	//Returns in *deviceCount the number of devices
	cout << "deviceCount:   " << deviceCount << "\n\n";
	if (deviceCount == 0)
	{
		cout << "error: no devices supporting CUDA.\n";
		exit(EXIT_FAILURE);
	}

	int dev = 0;
	cudaSetDevice(dev);	//Sets dev=0 device as the current device for the calling host thread.

	cudaDeviceProp devProps;
	cudaGetDeviceProperties(&devProps, dev);

	cout << "name: " << devProps.name << "\n";
	cout << "totalGlobalMem: " << devProps.totalGlobalMem << "\n";
	cout << "regsPerBlock: " << devProps.regsPerBlock << "\n";
	cout << "warpSize: " << devProps.warpSize << "\n";
	cout << "memPitch: " << devProps.memPitch << "\n\n";

	cout << "一个线程块中可使用的最大共享内存\n";
	cout << "devProps.sharedMemPerBlock: " << devProps.sharedMemPerBlock << "\n\n";

	cout << "一个线程块中可包含的最大线程数量\n";
	cout << "maxThreadsPerBlock: " << devProps.maxThreadsPerBlock << "\n\n";

	cout << "多维线程块数组中每一维可包含的最大线程数量\n";
	cout << "maxThreadsDim[0]: " << devProps.maxThreadsDim[0] << "\n";
	cout << "maxThreadsDim[1]: " << devProps.maxThreadsDim[1] << "\n";
	cout << "maxThreadsDim[2]: " << devProps.maxThreadsDim[2] << "\n\n";

	cout << "一个线程格中每一维可包含的最大线程块数量\n";
	cout << "maxGridSize[0]: " << devProps.maxGridSize[0] << "\n";
	cout << "maxGridSize[1]: " << devProps.maxGridSize[1] << "\n";
	cout << "maxGridSize[2]: " << devProps.maxGridSize[2] << "\n\n";

	cout << "clockRate: " << devProps.clockRate << "\n";
	cout << "totalConstMem: " << devProps.totalConstMem << "\n";
	cout << "textureAlignment: " << devProps.textureAlignment << "\n\n";

	cout << "计算能力:" << devProps.major << "." << devProps.minor << "\n\n";

	cout << "minor: " << devProps.minor << "\n";
	cout << "texturePitchAlignment: " << devProps.texturePitchAlignment << "\n";
	cout << "deviceOverlap: " << devProps.deviceOverlap << "\n";
	cout << "multiProcessorCount: " << devProps.multiProcessorCount << "\n";
	cout << "kernelExecTimeoutEnabled: " << devProps.kernelExecTimeoutEnabled << "\n";
	cout << "integrated: " << devProps.integrated << "\n";
	cout << "canMapHostMemory: " << devProps.canMapHostMemory << "\n";
	cout << "computeMode: " << devProps.computeMode << "\n";
	cout << "maxTexture1D: " << devProps.maxTexture1D << "\n";
	cout << "maxTexture1DMipmap: " << devProps.maxTexture1DMipmap << "\n";
	cout << "maxTexture1DLinear: " << devProps.maxTexture1DLinear << "\n";
	cout << "maxTexture2D: " << devProps.maxTexture2D << "\n";
	cout << "maxTexture2DMipmap: " << devProps.maxTexture2DMipmap << "\n";
	cout << "maxTexture2DLinear: " << devProps.maxTexture2DLinear << "\n";
	cout << "maxTexture2DGather: " << devProps.maxTexture2DGather << "\n";
	cout << "maxTexture3D: " << devProps.maxTexture3D << "\n";
	cout << "maxTexture3DAlt: " << devProps.maxTexture3DAlt << "\n";
	cout << "maxTextureCubemap: " << devProps.maxTextureCubemap << "\n";
	cout << "maxTexture1DLayered: " << devProps.maxTexture1DLayered << "\n";
	cout << "maxTexture2DLayered: " << devProps.maxTexture2DLayered << "\n";
	cout << "maxTextureCubemapLayered: " << devProps.maxTextureCubemapLayered << "\n";
	cout << "maxSurface1D: " << devProps.maxSurface1D << "\n";
	cout << "maxSurface2D: " << devProps.maxSurface2D << "\n";
	cout << "maxSurface3D: " << devProps.maxSurface3D << "\n";
	cout << "maxSurface1DLayered: " << devProps.maxSurface1DLayered << "\n";
	cout << "maxSurface2DLayered: " << devProps.maxSurface2DLayered << "\n";
	cout << "maxSurfaceCubemap: " << devProps.maxSurfaceCubemap << "\n";
	cout << "maxSurfaceCubemapLayered: " << devProps.maxSurfaceCubemapLayered << "\n";
	cout << "surfaceAlignment: " << devProps.surfaceAlignment << "\n";
	cout << "concurrentKernels: " << devProps.concurrentKernels << "\n";
	cout << "ECCEnabled: " << devProps.ECCEnabled << "\n";
	cout << "pciBusID: " << devProps.pciBusID << "\n";
	cout << "pciDeviceID: " << devProps.pciDeviceID << "\n";
	cout << "pciDomainID: " << devProps.pciDomainID << "\n";
	cout << "tccDriver: " << devProps.tccDriver << "\n";
	cout << "asyncEngineCount: " << devProps.asyncEngineCount << "\n";
	cout << "unifiedAddressing: " << devProps.unifiedAddressing << "\n";
	cout << "memoryClockRate: " << devProps.memoryClockRate << "\n";
	cout << "memoryBusWidth: " << devProps.memoryBusWidth << "\n";
	cout << "l2CacheSize: " << devProps.l2CacheSize << "\n";
	cout << "maxThreadsPerMultiProcessor: " << devProps.maxThreadsPerMultiProcessor << "\n";
	cout << "streamPrioritiesSupported: " << devProps.streamPrioritiesSupported << "\n";
	cout << "globalL1CacheSupported: " << devProps.globalL1CacheSupported << "\n";
	cout << "localL1CacheSupported: " << devProps.localL1CacheSupported << "\n";
	cout << "sharedMemPerMultiprocessor: " << devProps.sharedMemPerMultiprocessor << "\n";
	cout << "regsPerMultiprocessor: " << devProps.regsPerMultiprocessor << "\n";
	cout << "isMultiGpuBoard: " << devProps.isMultiGpuBoard << "\n";
	cout << "multiGpuBoardGroupID: " << devProps.multiGpuBoardGroupID << "\n";
	cout << "singleToDoublePrecisionPerfRatio: " << devProps.singleToDoublePrecisionPerfRatio << "\n";
	cout << "pageableMemoryAccess: " << devProps.pageableMemoryAccess << "\n";
	cout << "concurrentManagedAccess: " << devProps.concurrentManagedAccess << "\n";

	return 0;
}

在这里插入图片描述

3.CUDA核函数的参数(Kernel Function)

要对GPU编程中线程执行的任务进行了解。

/*
kernel函数的样例
*/
// CUDA核函数的定义
__global__ void addKernel(int *c, const int *a, const int *b)
{
    int i = threadIdx.x;
    c[i] = a[i] + b[i];
}

// CUDA核函数调用
addKernel<<<Dg,Db, Ns, S>>>(c, a, b);

需要注意以下几点:
1.函数前的标识“global”表示该函数在GPU执行。
2.在函数调用时,要通过<<< >>>来确定线程的数量。
3.调用kernel函数时各个参数的含义:
Dg:int型或者dim3类型(x,y,z),用于定义一个Grid中Block是如何组织的,如果是int型,则表示一维组织结构
Db:int型或者dim3类型(x,y,z),用于定义一个Block中Thread是如何组织的,如果是int型,则表示一维组织结构
Ns:size_t类型,可缺省,默认为0; 用于设置每个block除了静态分配的共享内存外,最多能动态分配的共享内存大小,单位为byte。 0表示不需要动态分配。
S:cudaStream_t类型,可缺省,默认为0。 表示该核函数位于哪个流。

3.1 1d Grid 和 1d Block

cuda的调用模式:
下图为1个grid有4个block块(编号:0-3),1个block块有8个线程(编号:0-7)。

kernel_name<<<4, 8>>>(...)

在cuda核函数中线程索引计算方式如下:

int threadId = blockIdx.x * blockDim.x + threadIdx.x 

3.2 2d Grid 和 2d Block

对于高维度计算索引的方式来说类似于计算多维数组中数据的数量。需要计算出Thread前面的所有Block中的Thread数量,在求出该Thread在本Block中的序号相加即可。

调用形式:

dim3 grid(4,1), block(2,2);
kernel_name<<<grid, block>>>(...)

索引计算方式:

int x = threadIdx.x + blockIdx.x * blockDim.x; 
int y = threadIdx.y + blockIdx.y * blockDim.y;
int offset = x + y * blockDim.x * gridDim.x; 

或者

int blockId = blockIdx.x + blockId.y * gridDim.x;
int threadId = blockId * (blockDim.x * blockDim.y) + (threadIdx.y * blockDim.x) + threadIdx.x;

:在二维排序中,Thread(0,1)表示第1行第0列的Thread,这跟我们传统中理解的横坐标和纵坐标不太一样;我们定义grid(4,2)表示第一维度有4个索引值,第二个维度有2个索引值,即2行4列。
在这里插入图片描述
:dim3是NVIDIA的CUDA编程中一种自定义的整型向量类型,基于用于指定维度的uint3。

例如:

dim3 grid(num1,num2,num3);

dim3类型最终设置的是一个三维向量,三维参数分别为x,y,z;

3.3 3d Grid 和 3d Block

3d的情况相对较少,它的线程计算公式如下:

int blockId = blockIdx.x + blockIdx.y * gridDim.x + gridDim.x * gridDim.y * blockIdx.z;
int threadIc = blockId * (blockDim.x * blockDim.y * blockDim.z) 
                       + (threadIdx.z * (blockDim.x * blockDim.y)) 
                       + (threadIdx.y * blockDim.x) + threadIdx.x;   

3.4 计算公式汇总

一维Grid 一维Block

blockId = blockIdx.x 
threadId = blockIdx.x *blockDim.x + threadIdx.x

一维Grid 二维Block

blockId = blockIdx.x 
threadId = blockIdx.x * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x

一维Grid 三维Block

blockId = blockIdx.x 
threadId = blockIdx.x * blockDim.x * blockDim.y * blockDim.z 
                        + threadIdx.z * blockDim.y * blockDim.x 
                        + threadIdx.y * blockDim.x + threadIdx.x

二维Grid 一维Block

int blockId = blockIdx.y * gridDim.x + blockIdx.x;  
int threadId = blockId * blockDim.x + threadIdx.x;

二维Grid 二维Block

int blockId = blockIdx.x + blockIdx.y * gridDim.x;  
int threadId = blockId * (blockDim.x * blockDim.y) 
                       + (threadIdx.y * blockDim.x) + threadIdx.x;  

二维Grid 三维Block

int blockId = blockIdx.x + blockIdx.y * gridDim.x;  
int threadId = blockId * (blockDim.x * blockDim.y * blockDim.z)  
                       + (threadIdx.z * (blockDim.x * blockDim.y))  
                       + (threadIdx.y * blockDim.x) + threadIdx.x;

三维Grid 一维Block

int blockId = blockIdx.x + blockIdx.y * gridDim.x + gridDim.x * gridDim.y * blockIdx.z;  
int threadId = blockId * blockDim.x + threadIdx.x;  

三维Grid 二维Block

int blockId = blockIdx.x + blockIdx.y * gridDim.x + gridDim.x * gridDim.y * blockIdx.z;  
int threadId = blockId * (blockDim.x * blockDim.y) 
                       + (threadIdx.y * blockDim.x) + threadIdx.x; 

三维Grid 三维Block

int blockId = blockIdx.x + blockIdx.y * gridDim.x + gridDim.x * gridDim.y * blockIdx.z;  
int threadId = blockId * (blockDim.x * blockDim.y * blockDim.z)  
                       + (threadIdx.z * (blockDim.x * blockDim.y))  
                       + (threadIdx.y * blockDim.x) + threadIdx.x;
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
目目目 录录录 目录 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · i 第一章 导论 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 1 1.1 从图形处理到通用并行计算 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 1 1.2 CUDATM :一种通用并行计算架构 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 3 1.3 一种可扩展的编程模型· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 3 1.4 文档结构 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 4 第二章 编程模型 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 7 2.1 内核· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 7 2.2 线程层次 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 8 2.3 存储器层次 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 11 2.4 异构编程 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 11 2.5 计算能力 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 11 第三章 编程接口 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 15 3.1 用nvcc编译 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 15 3.1.1 编译流程 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 16 3.1.1.1 离线编译 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 16 3.1.1.2 即时编译 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 16 3.1.2 二进制兼容性· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 17 3.1.3 PTX兼容性· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 17 3.1.4 应用兼容性 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 18 3.1.5 C/C++兼容性· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 19 3.1.6 64位兼容性 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 19 3.2 CUDA C运行时· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 19 ii CUDA编程指南5.0中文版 3.2.1 初始化 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 20 3.2.2 设备存储器 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 20 3.2.3 共享存储器 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 24 3.2.4 分页锁定主机存储器 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 32 3.2.4.1 可分享存储器(portable memory) · · · · · · · · · · · · · · · · 34 3.2.4.2 写结合存储器· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 34 3.2.4.3 被映射存储器· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 34 3.2.5 异步并发执行· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 35 3.2.5.1 主机和设备间异步执行· · · · · · · · · · · · · · · · · · · · · · · · · · 35 3.2.5.2 数据传输和内核执行重叠 · · · · · · · · · · · · · · · · · · · · · · · 36 3.2.5.3 并发内核执行· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 36 3.2.5.4 并发数据传输· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 36 3.2.5.5 流 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 37 3.2.5.6 事件· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 41 3.2.5.7 同步调用 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 42 3.2.6 多设备系统 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 42 3.2.6.1 枚举设备 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 42 3.2.6.2 设备指定 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 42 3.2.6.3 流和事件行为· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 43 3.2.6.4 p2p存储器访问 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 44 3.2.6.5 p2p存储器复制 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 45 3.2.6.6 统一虚拟地址空间 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 45 3.2.6.7 错误检查 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 46 3.2.7 调用栈 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 47 3.2.8 纹理和表面存储器 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 47 3.2.8.1 纹理存储器 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 47 3.2.8.2 表面存储器(surface) · · · · · · · · · · · · · · · · · · · · · · · · · · · · 60 3.2.8.3 CUDA 数组 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 65 目录 iii 3.2.8.4 读写一致性 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 66 3.2.9 图形学互操作性 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 66 3.2.9.1 OpenGL互操作性 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 67 3.2.9.2 Direct3D互操作性 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 70 3.2.9.3 SLI(速力)互操作性· · · · · · · · · · · · · · · · · · · · · · · · · · · 82 3.3 版本和兼容性· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 82 3.4 计算模式 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 83 3.5 模式切换 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 84 3.6 Windows上的Tesla计算集群模式 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 85 第四章 硬件实现 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 87 4.1 SIMT 架构 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 87 4.2 硬件多线程 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 88 第五章 性能指南 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 91 5.1 总体性能优化策略 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 91 5.2 最大化利用率· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 91 5.2.1 应用层次 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 91 5.2.2 设备层次 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 92 5.2.3 多处理器层次· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 92 5.3 最大化存储器吞吐量 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 94 5.3.1 主机和设备的数据传输· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 95 5.3.2 设备存储器访问 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 96 5.3.2.1 全局存储器 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 96 5.3.2.2 本地存储器 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 98 5.3.2.3 共享存储器 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 99 5.3.2.4 常量存储器 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 100 5.3.2.5 纹理和表面存储器 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 100 5.4 最大化指令吞吐量 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 100 iv CUDA编程指南5.0中文版 5.4.1 算术指令 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 101 5.4.2 控制流指令 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 104 5.4.3 同步指令 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 105 附录 A 支持CUDA的GPU · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 107 附录 B C语言扩展 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 109 B.1 函数类型限定符 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 109 B.1.1 device · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 109 B.1.2 global · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 109 B.1.3 host · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 109 B.1.4 noinline 和 forceinline · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 110 B.2 变量类型限定符 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 110 B.2.1 device · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 111 B.2.2 constant · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 111 B.2.3 shared · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 112 B.2.4 restrict · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 113 B.3 内置变量类型· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 115 B.3.1 char1、uchar1、char2、uchar2、char3、uchar3、char4、 uchar4、short1、ushort1、short2、ushort2、short3、ushort3、 short4、ushort4、int1、uint1、int2、uint2、int3、uint3、 int4、uint4、long1、ulong1、long2、ulong2、long3、ulong3、 long4、ulong4、float1、float2、float3、float4、double2 · · · 115 B.3.2 dim3类型 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 115 B.4 内置变量 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 115 B.4.1 gridDim · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 115 B.4.2 blockIdx · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 115 B.4.3 blockDim · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 117 B.4.4 threadIdx · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 117 B.4.5 warpSize · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 117 目录 v B.5 存储器栅栏函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 117 B.6 同步函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 119 B.7 数学函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 120 B.8 纹理函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 120 B.8.1 纹理对象函数· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 120 B.8.1.1 tex1Dfetch() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 120 B.8.1.2 tex1D()· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 121 B.8.1.3 tex2D()· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 121 B.8.1.4 tex3D()· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 121 B.8.1.5 tex1DLayered() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 121 B.8.1.6 tex2DLayered() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 122 B.8.1.7 texCubemap() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 122 B.8.1.8 texCubemapLayered()· · · · · · · · · · · · · · · · · · · · · · · · · · · 122 B.8.1.9 tex2Dgather() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 123 B.8.2 纹理参考函数· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 123 B.8.2.1 tex1Dfetch() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 123 B.8.2.2 tex1D()· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 124 B.8.2.3 tex2D()· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 124 B.8.2.4 tex3D()· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 125 B.8.2.5 tex1DLayered() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 125 B.8.2.6 tex2DLayered() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 125 B.8.2.7 texCubemap() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 125 B.8.2.8 texCubemapLayered()· · · · · · · · · · · · · · · · · · · · · · · · · · · 126 B.8.2.9 tex2Dgather() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 126 B.9 表面函数(surface)· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 126 B.9.1 表面对象函数· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 127 B.9.1.1 surf1Dread() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 127 B.9.1.2 surf1Dwrite() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 127 vi CUDA编程指南5.0中文版 B.9.1.3 surf2Dread() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 127 B.9.1.4 surf2Dwrite() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 128 B.9.1.5 surf3Dread() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 128 B.9.1.6 surf3Dwrite() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 128 B.9.1.7 surf1DLayeredread() · · · · · · · · · · · · · · · · · · · · · · · · · · · · 129 B.9.1.8 surf1DLayeredwrite() · · · · · · · · · · · · · · · · · · · · · · · · · · · 129 B.9.1.9 surf2DLayeredread() · · · · · · · · · · · · · · · · · · · · · · · · · · · · 129 B.9.1.10 surf2DLayeredwrite() · · · · · · · · · · · · · · · · · · · · · · · · · · · 130 B.9.1.11 surfCubemapread() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 130 B.9.1.12 surfCubemapwrite()· · · · · · · · · · · · · · · · · · · · · · · · · · · · · 131 B.9.1.13 surfCubemapLayeredread() · · · · · · · · · · · · · · · · · · · · · · 131 B.9.1.14 surfCubemapLayeredwrite() · · · · · · · · · · · · · · · · · · · · · 131 B.9.2 表面引用API · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 132 B.9.2.1 surf1Dread() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 132 B.9.2.2 surf1Dwrite() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 132 B.9.2.3 surf2Dread() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 132 B.9.2.4 surf2Dwrite() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 133 B.9.2.5 surf3Dread() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 133 B.9.2.6 surf3Dwrite() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 133 B.9.2.7 surf1DLayeredread() · · · · · · · · · · · · · · · · · · · · · · · · · · · · 134 B.9.2.8 surf1DLayeredwrite() · · · · · · · · · · · · · · · · · · · · · · · · · · · 134 B.9.2.9 surf2DLayeredread() · · · · · · · · · · · · · · · · · · · · · · · · · · · · 135 B.9.2.10 surf2DLayeredwrite() · · · · · · · · · · · · · · · · · · · · · · · · · · · 135 B.9.2.11 surfCubemapread() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 135 B.9.2.12 surfCubemapwrite()· · · · · · · · · · · · · · · · · · · · · · · · · · · · · 136 B.9.2.13 surfCubemapLayeredread() · · · · · · · · · · · · · · · · · · · · · · 136 B.9.2.14 surfCubemapLayeredwrite() · · · · · · · · · · · · · · · · · · · · · 137 B.10 时间函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 137 目录 vii B.11 原子函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 137 B.11.1 数学函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 138 B.11.1.1 atomicAdd() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 138 B.11.1.2 atomicSub() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 139 B.11.1.3 atomicExch() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 139 B.11.1.4 atomicMin() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 140 B.11.1.5 atomicMax()· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 140 B.11.1.6 atomicInc() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 140 B.11.1.7 atomicDec() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 141 B.11.1.8 atomicCAS() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 141 B.11.2 位逻辑函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 141 B.11.2.1 atomicAnd() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 141 B.11.2.2 atomicOr() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 142 B.11.2.3 atomicXor() · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 142 B.12 束表决(warp vote)函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 142 B.13 束洗牌函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 143 B.13.1 概览 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 143 B.13.2 在束内广播一个值 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 144 B.13.3 计算8个线程的前缀和· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 145 B.13.4 束内求和 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 146 B.14 取样计数器函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 146 B.15 断言 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 147 B.16 格式化输出 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 148 B.16.1 格式化符号 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 149 B.16.2 限制 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 149 B.16.3 相关的主机端API · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 150 B.16.4 例程 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 151 B.17 动态全局存储器分配 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 152 viii CUDA编程指南5.0中文版 B.17.1 堆存储器分配 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 153 B.17.2 与设备存储器API的互操作 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 154 B.17.3 例程 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 154 B.17.3.1 每个线程的分配 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 154 B.17.3.2 每个线程块的分配 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 155 B.17.3.3 在内核启动之间持久的分配 · · · · · · · · · · · · · · · · · · · · · 156 B.18 执行配置 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 159 B.19 启动绑定 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 160 B.20 #pragma unroll · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 162 B.21 SIMD 视频指令 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 163 附录 C 数学函数· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 165 C.1 标准函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 165 C.1.1 单精度浮点函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 165 C.1.2 双精度浮点函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 168 C.2 内置函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 171 C.2.1 单精度浮点函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 172 C.2.2 双精度浮点函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 172 附录 D C++语言支持· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 175 D.1 代码例子 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 175 D.1.1 数据类 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 175 D.1.2 派生类 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 176 D.1.3 类模板 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 177 D.1.4 函数模板 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 178 D.1.5 函子类 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 178 D.2 限制· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 180 D.2.1 预处理符号 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 180 D.2.2 限定符 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 180 目录 ix D.2.2.1 设备存储器限定符 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 180 D.2.2.2 Volatile限定符 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 182 D.2.3 指针· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 182 D.2.4 运算符 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 183 D.2.4.1 赋值运算符 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 183 D.2.4.2 地址运算符 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 183 D.2.5 函数· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 183 D.2.5.1 编译器生成的函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 183 D.2.5.2 函数参数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 184 D.2.5.3 函数内静态变量 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 184 D.2.5.4 函数指针 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 184 D.2.5.5 函数递归 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 185 D.2.6 类 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 185 D.2.6.1 数据成员 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 185 D.2.6.2 函数成员 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 185 D.2.6.3 虚函数 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 185 D.2.6.4 虚基类 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 185 D.2.6.5 Windows相关 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 185 D.2.7 模板· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 186 附录 E 纹理获取· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 187 E.1 最近点取样 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 187 E.2 线性滤波 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 187 E.3 查找表 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 189 附录 F 计算能力 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 191 F.1 特性和技术规范 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 191 F.2 浮点标准 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 195 F.3 计算能力1.x · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 198 x CUDA编程指南5.0中文版 F.3.1 架构· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 198 F.3.2 全局存储器 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 199 F.3.2.1 计算能力1.0和1.1的设备 · · · · · · · · · · · · · · · · · · · · · · · · 199 F.3.2.2 计算能力1.2和1.3的设备 · · · · · · · · · · · · · · · · · · · · · · · · 199 F.3.3 共享存储器 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 201 F.3.3.1 32位步长访问· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 201 F.3.3.2 32位广播访问· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 202 F.3.3.3 8位和16位访问 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 205 F.3.3.4 大于32位访问· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 205 F.4 计算能力2.x · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 206 F.4.1 架构· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 206 F.4.2 全局存储器 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 208 F.4.3 共享存储器 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 209 F.4.3.1 32位步长访问· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 209 F.4.3.2 大于32位访问· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 210 F.4.4 常量存储器 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 211 F.5 计算能力3.x · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 211 F.5.1 架构· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 211 F.5.2 全局存储器访问 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 212 F.5.3 共享存储器 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 213 F.5.3.1 64位模式 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 213 F.5.3.2 32位模式 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 213 附录 G 驱动API · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 215 G.1 上下文 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 218 G.2 模块· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 219 G.3 内核执行 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 220 G.4 运行时API和驱动API的互操作性 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 222 G.5 注意· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 223 表表表 格格格 5.1 原生算术指令吞吐量/每时钟每流多处
### 回答1: 《GPU编程实战(基于Python和CUDA)》是一本介绍如何使用Python和CUDA进行GPU编程的电子版教材。GPU编程是利用图形处理器(GPU)执行并行计算的过程,它在数据处理和科学计算等领域具有广泛的应用。 这本实战教材首先会对GPU编程的基础知识进行介绍,包括GPU体系结构、CUDA平台的概念以及编程模型等。接着,教材会详细讲解如何使用Python和CUDA进行开发,包括环境配置、CUDA编程的基本语法以及并行计算的技巧等。 该教材还会介绍一些实际的应用案例,如图像处理、机器学习和深度学习等。学习者可以通过这些案例了解如何使用GPU编程进行加速计算,以及如何优化算法以提高程序的性能。 使用Python和CUDA进行GPU编程的好处是可以利用Python语言的简洁性和易用性以及CUDA平台的高性能计算能力。通过这本实战教材,学习者可以快速入门并掌握GPU编程的基本技能,并能够利用GPU加速计算实际问题。 总之,《GPU编程实战(基于Python和CUDA)》电子版是一本帮助学习者快速入门并掌握GPU编程技能的实用教材。它不仅介绍了基本的理论知识,还通过实际案例帮助学习者了解如何应用GPU编程进行加速计算。无论是对于初学者还是已有一定基础的人来说,这本教材都是一本值得阅读和学习的好书。 ### 回答2: 《GPU编程实战(基于Python和CUDA)》电子版是一本通过结合Python和CUDA进行GPU编程的实践指南。本书涵盖了GPU结构和工作原理的基础知识,以及如何使用Python和CUDA进行并行计算的具体应用。 该书的主要内容包括: 1. GPU基础知识:介绍了GPU的基本架构和工作原理,帮助读者理解GPU编程的核心概念和原理。 2. CUDA编程:详细介绍了CUDA的使用方法,包括CUDA编程模型、线程和内存管理、并行计算等内容。读者将学习如何使用CUDA在GPU上运行高性能的并行计算任务。 3. Python和CUDA集成:介绍了如何使用Python和CUDA进行编程,并展示了如何在Python代码中调用CUDA函数进行GPU计算。这种集成方式可以让开发者更加方便地利用CUDA进行GPU编程。 4. 并行算法和应用:介绍了一些常见的并行算法和应用的实现方法,包括图像处理、矩阵运算、机器学习等。读者可以通过实践来深入理解并行计算的应用领域。 通过学习《GPU编程实战(基于Python和CUDA)》,读者可以了解GPU的基本原理和编程模型,掌握使用Python和CUDA进行GPU编程的技巧。这本书将帮助读者提升并行计算的能力,从而能够更加高效地利用GPU进行加速计算。同时,这本书也适合对GPU编程感兴趣的程序员和学生学习和参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daijingxin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值