⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testdensematrixvectormultiply.cpp

📁 PDE simulator on GPU.
💻 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 + -