《GPU高性能运算之CUDA》,gpu高性能运算之cuda
因为这本书内容很多,而且很多都是和其他讲解cuda的书重复的,所以我只翻译一些重点。时间就是金钱。让我们一起学习cuda。如有错误,请指正。
既然我暂时没时间仔细看第一章和第二章,那就从第三章开始吧。
我不喜欢被别人控制,所以我会重写所有没有它头文件的程序。有些节目太无聊,还是算了吧。
//hello.cu
#包含stdio.h
#包含cuda.h
int main( void ) {
printf(‘你好,世界! n’);
返回0;
}
这个第一个cuda程序并不是一个严格的cuda程序,它只是使用了cuda的头文件,并编译了命令:nvcc hello.cu -o hello
执行命令:/你好
没有在cuda上执行任何任务。
第二个节目
#包含stdio.h
#包含cuda.h
__global__ void内核(void){}
int main( void ) {
内核1,1
printf(‘你好,世界! n’);
返回0;
}
这个程序调用一个函数。__global__表示函数在CPU上调用,在GPU上执行。
三个尖括号中的参数是什么?看下一章
1 #包含stdio.h
2 #包含cuda.h
3 __global__ void add( int a,int b,int *c ) {
4 * c=a b;
5 }
6 int main(空)
7 {
8 int c;
9 int * dev _ c;
10 cudaMalloc( (void**) dev_c,sizeof(int));
11添加1,1 ( 2,7,dev _ c);
12 cudamemacpy(c,dev_c,sizeof(int),cudamemacpydevicetohost);
13 printf( 2 7=%dn ,c);
14 cuda free(dev _ c);
15返回0;
16 }
17
CudaMalloc()在GPU上分配存储空间。cudaMemcpy就是将运行结果从GPU复制到CPU,或者将执行参数从CPU复制到GPU。
CudaFree就是释放GPU上的空间,和CPU上的Free意思一样,只是对象不同。
本章的重点(对我来说)是3.3访问GPU(设备)
这一章呢?意思是,如果你没有正在使用的GPU的使用说明书,或者懒得拆解,或者为了让你的程序适用于更多不同的硬件环境,尝试通过编程来获取一些关于GPU的参数。
一大堆废话。你自己看吧。我有意义地说和写。
现在很多电脑不是只有一个GPU显卡,尤其是显卡做计算的集成环境,我们可以通过
int计数;
cudaGetDeviceCount(计数);
获取集成环境中的显卡数量。
然后通过结构cudaDeviceProp就可以得到显卡的相关性能。
以cuda3.0为例。
这个定义好的组织可以直接在你自己的程序中调用,不需要你自己定义。
struct cudaDeviceProp {
char name[256];//设备的名称
size _ t totalGlobalMem//全局内存的字节大小
size _ t sharedMemPerBlock//线程块可以使用的最大共享内存。字节为单位,多处理器上的所有线程块可以同时共享这些内存。
int regsPerBlock//线程块可以使用的32位寄存器的最大值,多处理器上的所有线程可以同时使用这些寄存器。
int warpSize//由线程计算的包装块大小
size _ t memPitch//内存复制是允许的最大间距,通过cudaMallocPitch()允许包含内存区域的内存的复制函数的最大间距,以字节为单位。
int maxThreadsPerBlock//每个块中的最大线程数
int maxThreadsDim[3];//块的每个维度的最大值
int maxGridSize[3];//网格每个维度的最大值
size _ t totalConstMem//常量内存的大小
int专业;//计算能力的主要代码
int minor//计算能力的二级代码
int clockRate//时钟频率
size _ t textureAlignment//纹理的对齐要求
int deviceOverlap//设备可以同时执行cudaMemcpy()和设备的核心代码吗?
int多处理器计数;//设备上多个处理器的数量
int kernelExecTimeoutEnabled//可以对核心代码的执行时间设置限制吗?
int集成;//这个GPU是集成的吗?
int canMapHostMemory//这个GPU可以说主CPU上的内存映射到GPU设备的地址空间吗?
int computeMode//计算模式
int maxTexture1D//一维纹理的最大维度
int max texture 2d[2];//二维口感的最大维度
int max texture 3d[3];//三维口感的最大维度
int max texture 2 Dar ray[3];//二维口感阵列的最大维度
(同Internationalorganizations)国际组织并发内核;//GPU是否支持同时执行多个核心程序
}
实例程序:
1 #包含标准视频
2 #包含标准库
3 #包含cuda.h
四
5 int main()
6 {
7 int I;
8 /*cudaGetDeviceCount(计数)*/
9 int计数
10 cudaGetDeviceCount(计数);
11 printf( CUDA设备的计数:%dn ,计数);
12 ////
13
14 cudaDeviceProp道具;
15 for(I=0;我数;我)
16 {
17 cudaGetDeviceProperties( prop,I);
18 printf(n -设备%d的一般信息- n ,I);
19 printf( cuda设备的名称:%sn ,属性。姓名);
20 printf(计算能力:%d.%dn ,prop.major,prop。未成年);
21 printf(时钟速率:%dn ,属性。时钟速率);
22 printf(设备复制重叠(同时执行一个cudaMemcpy()和内核执行):);
23如果(prop.deviceOverlap)
24 printf( Enabled n );
其他25个
26 printf( Disabled n );
27 printf(内核执行超时(在此设备上执行的内核是否有运行时限制):);
28如果(道具。kernelexectimeoutenabled)
29 printf( Enabled n );
其他30个
31 printf( Disabled n );
32
33 printf(n -设备%d - n ,我的内存信息);
34 printf(总全局内存字节数:%ldn ,属性。totalglobalmem);
35 printf(总常数内存:%ldn ,属性。totalconstmem);
36 printf(以字节为单位的内存副本的最大内存间距:%ldn ,属性。mempitch);
37 printf(纹理对齐:%ldn ,属性。纹理对齐);
38
39 printf(n -设备%d的下院议员信息- n ,I);
40 printf(多处理器计数:%dn ,属性。多协议计数);
41 printf(每个国会议员的共享内存(块):%ldn ,prop。sharedmperblock);
42 printf(每个国会议员的寄存器(块):%dn ,prop。regsperblock);
43 printf(经线中的线:%dn ,属性。扭曲尺寸);
44 printf(每个块的最大线程数:%dn ,属性。maxthreadsperblock);
45 printf(一个块中的最大线程维数:(%d,%d,%d)n ,prop.maxThreadsDim[0],prop.maxThreadsDim[1],prop。maxthreadsdim[2]);
46 printf( Max blocks dimensions in a grid:(%d,% d,%d)n ,prop.maxGridSize[0],prop.maxGridSize[1],prop。maxgridsize[2]);
47 printf( n );
48
49 printf( n设备是集成的国家政治保卫局。参见OGPU吗:);
50中频(集成螺旋桨)
51 printf(是! n’);
其他52个
53 printf(不! n’);
54
55 printf(设备能否将主机内存映射到库达设备地址空间:);
56 if(prop.canMapHostMemory)
57 printf(是! n’);
58其他
59 printf(不! n’);
60
61 printf(设备的计算模式:%dn ,属性。computemode);
62
63 printf( n 1D纹理的最大大小:%dn ,属性。max texture 1d);
64 printf( 2D纹理的最大尺寸:(%d,%d)n ,prop.maxTexture2D[0],prop。max texture 2d[1]);
65英寸印刷字体( 3D纹理的最大尺寸:(%d,%d,%d)n ,prop.maxTexture3D[0],prop.maxTexture3D[1],prop。max texture 3D[2]);
66//printf( 2D纹理数组的最大维数:(%d,%d,%d)n ,prop.maxTexture2DArray[0],prop.maxTexture2DArray[1],prop。max texture 2d array[2]);
67
68 printf(设备是否支持在同一上下文中同时执行多个内核:);
69 if(prop.concurrentKernels)
70 printf(是! n’);
71其他
72 printf(不! n’);
73 }
74
75 }
运行结果:
库达设备的数量:1
-设备0的一般信息-
库达设备名称:GeForce GTX 470
计算能力:2.0
时钟频率:1215000
设备复制重叠(同时执行cudaMemcpy()和内核执行):启用
内核执行超时(在此设备上执行的内核是否有运行时间限制):启用
-设备0的内存信息-
总全局内存字节数:1341325312
总常量内存:65536
内存副本的最大内存间距(以字节为单位):2147483647
纹理对齐:512
-设备0的下院议员信息-
多处理器数量:14
每国会议员共享内存(块):49152
每国会议员寄存器(块):32768
经纱数:32
每个块的最大线程数:1024
块中的最大螺纹尺寸:(1024,1024,64)
网格中的最大块尺寸:(65535,65535,65535)
设备是集成国家政治保卫局。参见OGPU吗:不是!
设备能否将主机内存映射到库达设备地址空间:可以!
设备的计算模式:0
1D纹理的最大尺寸:65536
2D纹理的最大尺寸:(65536,65535)
三维(three dimension的缩写)纹理的最大尺寸:(2048,2048,2048)
设备是否支持在同一上下文中同时执行多个内核:是!
yue @ Ubuntu-10:~/cuda/cuda bye $ vim cuda byex 331。铜
yue @ Ubuntu-10:~/cuda/cuda bye $ vim cuda byex 331。铜
岳@ Ubuntu-10:~/cuda/cuda bye $ 10 ./cuda
-巴什:/cuda:沒有此一檔案或目錄
岳@ Ubuntu-10:~/cuda/cuda bye $ 10 ./cudabyex331
库达设备的数量:1
-设备0的一般信息-
库达设备名称:GeForce GTX 470
计算能力:2.0
时钟频率:1215000
设备复制重叠(同时执行cudaMemcpy()和内核执行):启用
内核执行超时(在此设备上执行的内核是否有运行时间限制):启用
-设备0的内存信息-
总全局内存字节数:1341325312
总常量内存:65536
内存副本的最大内存间距(以字节为单位):2147483647
纹理对齐:512
-设备0的下院议员信息-
多处理器数量:14
每国会议员共享内存(块):49152
每国会议员寄存器(块):32768
经纱数:32
每个块的最大线程数:1024
块中的最大螺纹尺寸:(1024,1024,64)
网格中的最大块尺寸:(65535,65535,65535)
设备是集成国家政治保卫局。参见OGPU吗:不是!
设备能否将主机内存映射到库达设备地址空间:可以!
设备的计算模式:0
1D纹理的最大尺寸:65536
2D纹理的最大尺寸:(65536,65535)
三维(three dimension的缩写)纹理的最大尺寸:(2048,2048,2048)
设备是否支持在同一上下文中同时执行多个内核:是!
参考书籍: 《CUDA BY EXAMPLE》