Rapidmind计算库性能测试
生活随笔
收集整理的這篇文章主要介紹了
Rapidmind计算库性能测试
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? rapidmind.net提供了免費的計算庫下載,目的是使用C++ metaprogramming將計算與硬件平臺隔離開來,它提供一套運行庫做底層的優化工作。為了測試其真正的性能,以便于在未來的渲染器中使用,我做了一個簡單的性能測試程序,將一張1920x1080尺寸的TIF從RGB轉換為CIE XYZ。
測試平臺為我的acer 5572ANWXCi筆記本,Core Duo T2250、945、1.5G DDR2、geforce 7300go 64bit 128M。
單位為毫秒millisecond,加“*”表示回讀GPU數據到內存。Joky.tif大小為300x400,120000 pixels。HDTV.tif大小為1920x1080,2073600 pixels。
測試結果表明,如果不回讀,那么可以放心大膽的使用GPU計算。但是如果回讀,那么速度將急劇下降。總線是一個原因,但估計更深層次的是GPU的工作機制以及設計。但是可以肯定的是,如果使用RM開發基于多核心的CPU比如CELL BE處理器的計算程序,那么帶來的好處是及其明顯的,避免了硬件編碼優化工作,節省了人力物力,最重要的是可以獲得相當不錯的性能。
測試代碼如下,其中CPU部分沒有優化,但是打開了VC71的SSE2開關。
#include?<TCHAR.h>
#include?<cstdio>
#include?<rapidmind/platform.hpp>
#include?<cximage/ximage.h>
#pragma?comment(lib,"rmplatform-vc7-md.lib")
#pragma?comment(lib,"cximagecrt.lib")
using?namespace?rapidmind;
int?main()
{
????float?Time;
????CxImage?Image("C:\\HDTV.tif",CXIMAGE_FORMAT_TIF);
????long?size?=?Image.GetWidth()*Image.GetHeight()*sizeof(BYTE)*4;
????BYTE*?DataPtr?=?NULL;
????if(?!Image.Encode2RGBA(DataPtr,size)?)
????????printf("Shit!\n");
????rapidmind::init();
/**//*
const?mat3?RGBtoCIEmat?=?mat3(0.412453,?0.212671,?0.019334,
??????????????????????????????0.357580,?0.715160,?0.119193,
??????????????????????????????0.180423,?0.072169,?0.950227);
*/
????Value3f?C0(0.412453f,0.357580f,0.180423f);
????Value3f?C1(0.212671f,0.715160f,0.072169f);
????Value3f?C2(0.019334f,0.119193f,0.950227f);
????Program?Prog?=?RM_BEGIN_PROGRAM("stream"){
????????In<Value4ub>?rgb;
????????Out<Value4ub>?cie;
????????cie(0)?=?dot(rgb(0,1,2),C0);
????????cie(1)?=?dot(rgb(0,1,2),C1);
????????cie(2)?=?dot(rgb(0,1,2),C2);
????????cie(3)?=?255;
????}RM_END
????Array<1,Value4ub>?Input(Image.GetWidth()*Image.GetHeight());
????DataPtr?=?Input.write_data();
????Array<1,Value4ub>?Output;
????rapidmind::compile(Output,Prog(Input));
????Output?=?Prog(Input);
????DataPtr[0]?=?255;
????rapidmind::Timer?Start?=?rapidmind::Timer::now();
????Output?=?Prog(Input);
????rapidmind::finish();
?????
????//const?BYTE*?RMResultPtr?=?Output.read_data();
????rapidmind::Timer?End?=?rapidmind::Timer::now();
????rapidmind::finish();
????Time?=?End.milliseconds()?-?Start.milliseconds();
????printf("Use?RM?:?%f?milliseconds\n",Time);
????int?Width?=?Image.GetWidth(),Height?=?Image.GetHeight();
????Start?=?rapidmind::Timer::now();
????for(int?i=0;i<Width*Height;i++){
????????float?r?=?DataPtr[i*4+0],g=DataPtr[i*4+1],b=DataPtr[i*4+2];
????????float?x?=?r*0.412453f?+?g*0.357580f?+?b*0.180423f;
????????float?y?=?r*0.212671f?+?g*0.715160f?+?b*0.072169f;
????????float?z?=?r*0.019334f?+?g*0.119193f?+?b*0.950227f;
????????DataPtr[i*4+0]?=?x;
????????DataPtr[i*4+1]?=?y;
????????DataPtr[i*4+2]?=?z;
????????DataPtr[i*4+2]?=?255;
????}
????End?=?rapidmind::Timer::now();
????Time?=?End.milliseconds()?-?Start.milliseconds();
????printf("Use?CPU:?%f?milliseconds\n",Time);
????system("PAUSE");
????return?0;
}
測試平臺為我的acer 5572ANWXCi筆記本,Core Duo T2250、945、1.5G DDR2、geforce 7300go 64bit 128M。
| GPU | CPU | GPU* | CPU* | |
| Joky.tif | 1.809444 | 28.306510 | 36.927075 | 12.229953 |
| HDTV.tif | 7.248393 | 179.199637 | 465.021794 | 173.764878 |
單位為毫秒millisecond,加“*”表示回讀GPU數據到內存。Joky.tif大小為300x400,120000 pixels。HDTV.tif大小為1920x1080,2073600 pixels。
測試結果表明,如果不回讀,那么可以放心大膽的使用GPU計算。但是如果回讀,那么速度將急劇下降。總線是一個原因,但估計更深層次的是GPU的工作機制以及設計。但是可以肯定的是,如果使用RM開發基于多核心的CPU比如CELL BE處理器的計算程序,那么帶來的好處是及其明顯的,避免了硬件編碼優化工作,節省了人力物力,最重要的是可以獲得相當不錯的性能。
測試代碼如下,其中CPU部分沒有優化,但是打開了VC71的SSE2開關。
#include?<TCHAR.h>
#include?<cstdio>
#include?<rapidmind/platform.hpp>
#include?<cximage/ximage.h>
#pragma?comment(lib,"rmplatform-vc7-md.lib")
#pragma?comment(lib,"cximagecrt.lib")
using?namespace?rapidmind;
int?main()
{
????float?Time;
????CxImage?Image("C:\\HDTV.tif",CXIMAGE_FORMAT_TIF);
????long?size?=?Image.GetWidth()*Image.GetHeight()*sizeof(BYTE)*4;
????BYTE*?DataPtr?=?NULL;
????if(?!Image.Encode2RGBA(DataPtr,size)?)
????????printf("Shit!\n");
????rapidmind::init();
/**//*
const?mat3?RGBtoCIEmat?=?mat3(0.412453,?0.212671,?0.019334,
??????????????????????????????0.357580,?0.715160,?0.119193,
??????????????????????????????0.180423,?0.072169,?0.950227);
*/
????Value3f?C0(0.412453f,0.357580f,0.180423f);
????Value3f?C1(0.212671f,0.715160f,0.072169f);
????Value3f?C2(0.019334f,0.119193f,0.950227f);
????Program?Prog?=?RM_BEGIN_PROGRAM("stream"){
????????In<Value4ub>?rgb;
????????Out<Value4ub>?cie;
????????cie(0)?=?dot(rgb(0,1,2),C0);
????????cie(1)?=?dot(rgb(0,1,2),C1);
????????cie(2)?=?dot(rgb(0,1,2),C2);
????????cie(3)?=?255;
????}RM_END
????Array<1,Value4ub>?Input(Image.GetWidth()*Image.GetHeight());
????DataPtr?=?Input.write_data();
????Array<1,Value4ub>?Output;
????rapidmind::compile(Output,Prog(Input));
????Output?=?Prog(Input);
????DataPtr[0]?=?255;
????rapidmind::Timer?Start?=?rapidmind::Timer::now();
????Output?=?Prog(Input);
????rapidmind::finish();
?????
????//const?BYTE*?RMResultPtr?=?Output.read_data();
????rapidmind::Timer?End?=?rapidmind::Timer::now();
????rapidmind::finish();
????Time?=?End.milliseconds()?-?Start.milliseconds();
????printf("Use?RM?:?%f?milliseconds\n",Time);
????int?Width?=?Image.GetWidth(),Height?=?Image.GetHeight();
????Start?=?rapidmind::Timer::now();
????for(int?i=0;i<Width*Height;i++){
????????float?r?=?DataPtr[i*4+0],g=DataPtr[i*4+1],b=DataPtr[i*4+2];
????????float?x?=?r*0.412453f?+?g*0.357580f?+?b*0.180423f;
????????float?y?=?r*0.212671f?+?g*0.715160f?+?b*0.072169f;
????????float?z?=?r*0.019334f?+?g*0.119193f?+?b*0.950227f;
????????DataPtr[i*4+0]?=?x;
????????DataPtr[i*4+1]?=?y;
????????DataPtr[i*4+2]?=?z;
????????DataPtr[i*4+2]?=?255;
????}
????End?=?rapidmind::Timer::now();
????Time?=?End.milliseconds()?-?Start.milliseconds();
????printf("Use?CPU:?%f?milliseconds\n",Time);
????system("PAUSE");
????return?0;
}
轉載于:https://www.cnblogs.com/Jedimaster/archive/2007/10/02/912882.html
總結
以上是生活随笔為你收集整理的Rapidmind计算库性能测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分层在深一步学习
- 下一篇: java中long类型转换为int类型