CUDA——GPU参数获取

来源:互联网 发布:www.226bbb.com新域名 编辑:程序博客网 时间:2024/06/05 10:45

一.介绍

   利用CUDA进行编程时,GPU的参数对程序的效率等都有很大的影响,而此处的GPU参数不在仅限于GPU的显存大小,GPU的核心数,还有许多其他的参数需要注意,而这些参数往往是由GPU的架构决定的。

   下文中会简单介绍一下在进行CUDA编程时需要注意的几个参数。

GPU的参数可以由多种途径获取:

1.      网上搜索GPU型号

2.      CUDAsample程序里有一个deviceQuery样例,使用了CUDA的函数获取GPU信息,这个是最直接有效的。

3.      GPU-ZCUDA-Z小工具也可以直观的获取GPU的相关信息。

二.GT750参数——deviceQuery

   此处采用()中介绍的多种方法来获取GPU信息。

   如下图所示,是利用CUDAsample程序里的deviceQuery样例获取的部分信息,此处我对程序进行了部分的修改,为了自己看的更直观。

CUDA编程初期比较重要的几个参数有:

1.      计算能力:

CUDA的有些函数会对计算能力有要求,计算能力肯定越高越好

2.      全局内存:

也就是显卡显存大小,直接决定了可以运算数据的大小。在Matlab中,当计算量太大是会有memoryout。同样CUDA编程中显存的大小也会限制数据量的大小。一般处理都够用,数据太大就要考虑集群了。

3.      流处理器个数:

在新的Kepler架构中只的是SMX(StreamMultiprocessor eXtreme)的个数,对应以前的Fermi等架构中SM(StreamMultiprocessor)

从名称可以看出,SMXSM的加强版,最显著的区别就是SMX中的CUDAcore显著增加,由SM时代的32个到了SMX时代的192个。

4.      一个线程块中的最大线程个数:

      一般不要让线程块中线程的个数大于这个值,否则会影响效率。

线程块中的线程个数就是调用kernel函数时定义的Block中元素的个数。

在我的GT750M中一个线程块中的最大线程数为1024,因此我一般分配的块大小为(32*32)。

5.      每个线程块可用的最大共享内存数:

由于线程对共享内存的访问速度比访问显存的速度快得多,因此很多时候

会考虑使用共享内存。例如:矩阵乘法的实现。

    在共享内存使用的过程中要确保不超过共享内存的数量。

CUDA——GPU参数获取

GPU信息

 

三.GT750参数——GPU-Z

1.      GPU

   GK107是该显卡GT750M采用的架构核心。一般同一个架构的参数都是类似的。相似的还有GK104等等。从这个参数去了解CPU的信息也可以。GK107有一个GPC,一个GPC里面包含两个SMX。

CUDA——GPU参数获取                          GK107

2.      Shaders

就是我们通常说的CUDA core的数目。由于CT750M有两个SMX组成,每个

SMX上有192CUDAcore,所以总共有384CUDAcore

同样的,GTX 6808SMX,每个SMX上有192CUDAcore,所以总共有192*8=1536CUDAcore

3.      Memory Size

显存大小,也就是共享内存大小。

CUDA——GPU参数获取

GPU-Z信息

四.GT750M参数——CUDA-Z

  下面使用CUDA-Z测出的参数,其中有几个很关键,是上面的两个没有直观获得的。

1.      Therds Per Multiproc

每个SMX的线程数,此处是2048,两个SMX就是4096。所以GT750M每次

最多并行执行的线程数为4096

换句话说,CUDA程序中的线程并非完全并行进行的,比如要执行8192个线程,实际上是分两次执行完的。只不过直接交给GPU了,我们就不用管了。

2.      Multiprocessor

就是SMX的个数,括号内的384就是通常所说的CUDAcore个数。

CUDA——GPU参数获取

五.总结

1.      显卡型号

2.      计算能力

3.      SMX数量

 每个SMX最多控制8个线程块,对于我的GT750M,每个SMX2048个线

程,也就是说至少为每个线程块分配2048/8=256=16*16个线程才能保证线程被充分使用。然而,又要求每个线程块最多有1024=32*32个线程,所以至少要分配两个线程块。也就是说至少两个线程块在工作,这也是相对来说比较合理的。

    综上,针对我这个显卡,我一般分配的矩阵块大小都是32*32,每个SMX两个活动块。当然也可以16*16,这样的话就是有8个线程块同时工作,达到上限。

    当然,每个线程块中的线程数也可以是25*25,但是这样其实是不好的,因为在计算机里面很多都是以2n次方为单元的。比方说,GPU参数中的warp(线程束)的大小为32,是一个什么最小单元。甚至还有些地址的访问等。相似的可以参考cudaMallocPitch cudaMemcpy2D的使用。就是为了满足128Byte的对齐。

4.      CUDA core个数

由于不太了解core与线程的关系,所以一直没体会到core个数的用处。总之

越多越好。

5.      每个线程块中的最大线程数

这个参数对程序的效率也有挺大影响的。



0 0
原创粉丝点击