【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代码:
{
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代码:
{
#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代码
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高呢,如果高了很多,那么我们下一步的工作将会很有意义。