搜索
bottom↓
回复: 7

[原创]GPU和CPU的性能比较,C++ AMP 加速大规模并行计算

[复制链接]

出0入0汤圆

发表于 2012-3-29 20:27:59 | 显示全部楼层 |阅读模式
本帖最后由 linhaimi 于 2012-3-29 21:12 编辑

比较一下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。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-3-29 20:35:52 | 显示全部楼层
GPU 快这么多。 嗯  明天试试WIN8

出0入42汤圆

发表于 2012-3-29 21:20:35 | 显示全部楼层
这种计算正是GPU的拿手好戏。

AMD的VLIW架构非常适合做这种计算。

(前一段时间流行“挖矿”,用的全都是AMD卡,就是这个原因。)

出0入0汤圆

发表于 2012-3-29 21:26:53 | 显示全部楼层
GPU果然强大

出0入0汤圆

发表于 2012-3-29 21:38:19 来自手机 | 显示全部楼层
显卡本来就是适合做并行运算的。快是正常的。不过只能并行不能交叉,没什么意义,每一个流处理器的数据是独立的,不能共享。

出0入0汤圆

发表于 2012-3-31 00:29:26 | 显示全部楼层
其实这里有个瓶颈是内存和显存之间的传输,我们做软件无线电的,用GPU做协处理器,发现最后系统的实时性能卡在数据在内存到显存的传输上了。不过也可能是水平有限,没有优化好。

出0入663汤圆

发表于 2012-3-31 05:22:49 | 显示全部楼层
比较有点不太公平:
1.GPU做单精度比双精度快很多
2.CPU应该用SIMD指令优化

i5 450M峰值运算速度是38.4GFLOPS双精度/76.8GFLOPS单精度,HD5650M峰值运算速度大概是320GFLOPS单精度,但双精度只有1/5,即72GFLOPS,差距其实并没有那么大的。
而且如5楼6楼所说,GPU计算的瓶颈在于内存吞吐量和只适用于高度并行性算法,峰值速度和实际速度差距还是挺大的,例如CUDA加速的H.264编码引擎和AVX指令集优化的编码引擎相比其实快不到一倍,而且CUDA转出来那画质如何大家都懂的。

出0入0汤圆

发表于 2012-4-1 19:16:03 | 显示全部楼层
专用 与 泛用 的差别
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-12 11:06

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表