技术开发 频道

GPGPU对CPU和OpenMP的运算效率比较

  【IT168 文档】由于最近要做Cg运算平台到Cuda平台的算法移植工作,所以最近正考虑做一个GPGPU和Cpu运算效率的比较公正,但是由于手头的笔记本电脑仅仅对Cuda支持不好(上次安装Cuda后显卡烧坏了),所以这里先做一个使用Cg编程的矩阵运算(加法):

  for (int j =0;j <2000;j++)

  MatrixC =Sum( MatrixA + MatrixB*j); //这个公式没有特殊意义,目的就是模拟一个高计算量而已

  ====================

  测试环境:

  CPU :T5550 1.85HZ (我用的是笔记本)

  显卡nv8400M gs (显存128M,16个sp,64bit位宽,shader频率800HZ)

  内存:1G

  编译环境: VS2005 (该编译器已经接近intel的编译器效果了)

  使用语言:C++,OpenMP。OpenGL+Cg

  ===================

  测试方法:

  对上面的公式,分别使用不同的编程模型来实验:

  1. 普通的CPU运算

  2 .方法1 加上OpenMP优化

  3. 使用Cg 进行GPU编程

  ===================

  测试结果如下:

  型号 时间(ms)

  --------------------------------------------------------------

  intel core T5500 : 23437 ms

  intel core T5500(MP) : 11812 ms (比普通cpu计算快2倍多)

  8400gs : 1969 ms (比普通Cpu计算快11倍多,比OpenMP快5倍)

  ===============================

  部分代码(写的比较粗糙,没有考虑优化)

  CPU代码:

void CPUCompute()
{
   for(int i=0;i<texSize*texSize; i++)
        {
           
for(int j = 0;j<comtime;j++)
                {
                
//  float outalpha = alpha-j/comtime;

                    result[i]
=data[i]+ data2[i]*j;

               }
        }
}

   OpenMP代码:

void CPUComputeOpenMP()
{
#pragma omp parallel
for //
for(int i=0;i<texSize*texSize; i++)
      {
         
for(int j = 0;j<comtime;j++)
              {
               result[i]
=data[i]+ data2[i]*j;
             }
     }
}

   Cg代码

struct Output {
  float4 color : COLOR;
};

Output CgFunction(float4 color : COLOR,
in float2 inTex  : TEXCOORD0,
uniform  samplerRECT Texture1: TEX0,
//注意不要使用sampler2D
uniform  samplerRECT Texture2: TEX0,//注意不要使用sampler2D
uniform float  alpha,
uniform
int comtime
)
{
   Output OUT;

    
for(int i = 0;i<comtime;i++)
    {
      OUT.color
= texRECT(Texture1, inTex) + texRECT(Texture2, inTex)*i;
    }

  
return OUT;
}

   总结:

  对于kernel 计算量不大,而Kernel数量很多的时候,使用GPU进行运算比CPU有明显的优势(10倍以上),即使用的GPU很低端(我的可是8400gs啊,笔记本上的显卡),但是当Kernel上的运算量加大的时候(例如加入很多除法运算),GPU效率不是很明显了,也就2-3倍的优化效果(这里不具体分析了)

  下一步计划:

  1. 打算使用8800GTX 尝试一下上面的代码,看看在GPU的SP数目增多,内存位宽加大后,效率有多大的提高。

  2. 使用Cuda 来优化上面的代码,与Cg进行比较,分析除了Cuda在编程方式上有优势外,是否在效率上也比Cg高呢,如果高了很多,那么我们下一步的工作将会很有意义。

0
相关文章