比较一下CPU和GPU的通用计算能力,我的显卡是AMD的,没法使用CUDA……前段时间尝鲜Win8,顺便就下载了一个Visual Studio 11 Beta,发现里面有一个C++ AMP,拿来比较一下。根据目前的资料,只要显卡支持DirectX 11就可以使用 C++ AMP,就是将代码编译成x86和HLSL
比赛的方法是准备一个10000个32位浮点数,对每个浮点数做100000次“X = (X + 0.1) / 2.3”的迭代。考虑到现在的处理器都是多核的,在CPU计算部分使用OpenMP将循环展开、代码做速度优化。
为避免Visual Studio对测试造成干扰,测试时关闭VS,双击程序运行。
代码如下:
#include <iostream>
#include <amp.h>
#include <WinBase.h>
#define COUNT 10000
float nickName_GPU[COUNT];
float nickName_CPU[COUNT];
int main(void)
{
LARGE_INTEGER freq;
LARGE_INTEGER strt;
LARGE_INTEGER ed;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&strt);
concurrency::array_view<float> myView(COUNT, nickName_GPU); //将数据打入显存
concurrency::parallel_for_each(myView.extent, [=] (concurrency::index<1> idx) restrict(amp)
{
for(int i = 0; i < 100000; i++)
{
myView[idx] = (myView[idx] + 0.1f) / 2.3f;
}
});
myView.synchronize();//显式等待GPU计算完成并将数据打回内存
QueryPerformanceCounter(&ed);
printf("GPU耗时: %d 毫秒\r\n", (ed.QuadPart - strt.QuadPart) * 1000 / freq.QuadPart);
QueryPerformanceCounter(&strt);
#pragma omp parallel
for(int idx = 0; idx < COUNT; idx++)
{
for(int i = 0; i < 100000; i++)
{
nickName_CPU[idx] = (nickName_CPU[idx] + 0.1f) / 2.3f;
}
}
QueryPerformanceCounter(&ed);
printf("CPU耗时: %d 毫秒\r\n", (ed.QuadPart - strt.QuadPart) * 1000 / freq.QuadPart);
for(int idx = 0; idx < COUNT; idx++)
{
if(nickName_CPU[idx] != nickName_GPU[idx])
{
puts("CPU和GPU的计算结果不相符!");
getchar();
return 0;
}
}
puts("测试结束");
getchar();
return 0;
}
测试结果:
运行环境:处理器:i5 450M 2.4GHz 显卡:HD5650 操作系统:Windows 7 64位 内存:8GB