📄 testdensematrixvectormultiply.cpp
字号:
// TestDenseMatrixVectorMultiply.cpp: implementation of the TestDenseMatrixVectorMultiply class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "shadow.h"
#include "TestDenseMatrixVectorMultiply.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#include "CommonHW.h"
#include "pbuffer.h"
#include "VectorOnGPU.h"
#include "DenseMatrixOnGPU.h"
#include "DenseMatrixVectorMultiply.h"
void TestclMatVec()
{
CVectorOnGPU x , Vresult;
CDenseMatrixOnGPU A;
int i,j;
float *Vx = new float[DIM_TEST];
float *Vr = new float[DIM_TEST];
float *MA = new float[DIM_TEST*DIM_TEST];
/////input data
for(i=0;i<DIM_TEST;i++)
{
Vx[i] = (float)rand()/RAND_MAX;
}
for(j=0;j<DIM_TEST*DIM_TEST;j++)
{
MA[j] = (float)rand()/RAND_MAX;
}
//////////////////////////////////////////////////////////////////////////////
//// matrix * vector _ fragment program ......16
TEST_RESULT_START
x.SetData(Vx,DIM_TEST);
A.SetData(MA, DIM_TEST);
Vresult.SetData(NULL, DIM_TEST);
TEST_RESULT_END
int Width = x.GetWidth();
int Height = x.GetHeight();
for(i=0;i<2;i++)
{
////// Render To Texture with Float PBuffer1
if( pbuffer[i] != NULL)
{
delete pbuffer[i];
pbuffer[i] = NULL;
}
pbuffer[i] = new CFloatPBuffer(Width, Height);
pbuffer[i]->Initialize();
pbuffer[i]->BeginCapture();
//////////////////////////////////////////////
///// Clear the framebuffer firstly to avoid the previous computation
///// This step is important to avoid computation errors
// The viewing settings.
glShadeModel( GL_FLAT );
glDisable ( GL_DEPTH_TEST );
glDisable(GL_CULL_FACE);
glClearColor( 0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0,0,Width,Height);
glMatrixMode ( GL_PROJECTION );
glLoadIdentity();
glOrtho( 0, Width, 0, Height, -1.0, 1.0 );
glMatrixMode ( GL_MODELVIEW );
glLoadIdentity();
pbuffer[i]->EndCapture();
}
TEST_RESULT_START
for(int k=0;k<30;k++)
DenseMatVecFP(A, x, Vresult);
TEST_RESULT_END
FILE *fp = fopen("testTime.txt","w");
fprintf(fp,"time = %f\n", time_cost/30);
///////Verify the result
int Dim_Vector;
float *vx = x.GetData(Dim_Vector);
float *vA = A.GetData(Dim_Vector);
TEST_RESULT_START
float *vr = Vresult.GetData(Dim_Vector);
TEST_RESULT_END
float diff = 0;
TEST_RESULT_START
for(i=0;i<Dim_Vector;i++)
{
Vr[i] = 0;
for(j=0;j<Dim_Vector;j++)
Vr[i] += vA[i*Dim_Vector+j]*vx[j];
diff += vr[i] - Vr[i];
fprintf(fp,"GPU =%f CPU= %f, diff=%f\n", vr[i], Vr[i], vr[i]-Vr[i]);
}
TEST_RESULT_END
fprintf(fp,"time = %f\n", time_cost);
fprintf(fp,"diff on GPU&CPU= %f\n", diff);
/*
for(i=0;i<Dim_Vector;i++)
{
for(j=0;j<Dim_Vector;j++)
fprintf(fp,"%6.0f ", vA[i*Dim_Vector+j]);
fprintf(fp,"\n");
}
for(i=0;i<Dim_Vector;i++)
{
fprintf(fp,"GPU =%f CPU= %f\n", vr[i], Vr[i]);
}
*/
fclose(fp);
delete[] vr;
delete[] Vx;
delete[] Vr;
delete[] MA;
return;
}
void TestMultiMatVec()
{
CVectorOnGPU x , Vresult;
CDenseMatrixOnGPU A;
int i,j;
float *Vx = new float[DIM_TEST];
float *Vr = new float[DIM_TEST];
float *MA = new float[DIM_TEST*DIM_TEST];
/////input data
for(i=0;i<DIM_TEST;i++)
{
Vx[i] = (float)rand()/RAND_MAX;
for(j=0;j<DIM_TEST;j++)
{
MA[i*DIM_TEST+j] = (float)rand()/RAND_MAX;
}
}
A.SetMultiData(MA, DIM_TEST);
x.SetData(Vx,DIM_TEST);
Vresult.SetData(NULL, DIM_TEST);
int Width = x.GetWidth();
int Height = x.GetHeight();
for(i=0;i<2;i++)
{
////// Render To Texture with Float PBuffer1
if( pbuffer[i] != NULL)
{
delete pbuffer[i];
pbuffer[i] = NULL;
}
pbuffer[i] = new CFloatPBuffer(Width, Height);
pbuffer[i]->Initialize();
pbuffer[i]->BeginCapture();
//////////////////////////////////////////////
///// Clear the framebuffer firstly to avoid the previous computation
///// This step is important to avoid computation errors
// The viewing settings.
glShadeModel( GL_FLAT );
glDisable ( GL_DEPTH_TEST );
glDisable(GL_CULL_FACE);
glClearColor( 0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0,0,Width,Height);
glMatrixMode ( GL_PROJECTION );
glLoadIdentity();
glOrtho( 0, Width, 0, Height, -1.0, 1.0 );
glMatrixMode ( GL_MODELVIEW );
glLoadIdentity();
pbuffer[i]->EndCapture();
}
//MultiDenseMatVecMultiTexFP(A, x, Vresult);
TEST_RESULT_START
//for(int k=0;k<30;k++)
MultiDenseMatVecFP(A, x, Vresult);
//MultiDenseMatVecMultiTexFP(A, x, Vresult);
TEST_RESULT_END
///////Verify the result
FILE *fp = fopen("testTime.txt","w");
fprintf(fp,"GPU time = %f\n", time_cost/30);
///////Verify the result
int Dim_Vector;
float *vr = Vresult.GetData(Dim_Vector);
float diff = 0;
TEST_RESULT_START
for(i=0;i<Dim_Vector;i++)
{
Vr[i] = 0;
for(j=0;j<Dim_Vector;j++)
Vr[i] += MA[i*Dim_Vector+j]*Vx[j];
diff += vr[i] - Vr[i];
fprintf(fp,"%d CPU = %f, GPU = %f, diff=%f\n", i, Vr[i], vr[i], Vr[i]-vr[i]);
}
TEST_RESULT_END
fprintf(fp,"CPU time = %f\n", time_cost);
fprintf(fp,"diff on GPU&CPU= %f\n", diff);
/*
for(i=0;i<Dim_Vector;i++)
{
for(j=0;j<Dim_Vector;j++)
{
fprintf(fp,"%4f ", vA[i*Dim_Vector+j]);
}
fprintf(fp,"\n");
}
*/
fclose(fp);
delete[] vr;
delete[] Vx;
delete[] Vr;
delete[] MA;
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -