《GPU高性能运算之CUDA》,gpu高性能运算之cuda

  《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》

《GPU高性能运算之CUDA》,gpu高性能运算之cuda