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

📄 testvectoroperations.cpp

📁 PDE simulator on GPU.
💻 CPP
字号:
// TestVectorOperations.cpp: implementation of the TestVectorOperations class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "shadow.h"
#include "TestVectorOperations.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 "VectorVectorOperation.h"

void TestclVecOp()
{
	CVectorOnGPU x ,y, Vresult;
	float coefficient_x, coefficient_y;
	int i;

	float *Vx = new float[DIM_TEST];
	float *Vy = new float[DIM_TEST];
	/////input data
	for(i=0;i<DIM_TEST;i++)
	{
		Vx[i] = i*1000;
		Vy[i] = i;
	}
	///////////////////////////////////////////////////////
	//// Initialize vectors and matrix

TEST_RESULT_START
	x.SetData(Vx,DIM_TEST);
	y.SetData(Vy,DIM_TEST);
	Vresult.SetData(NULL, DIM_TEST);
TEST_RESULT_END

	int Width = x.GetWidth();
	int Height = x.GetHeight();

	////// Render To Texture with Float PBuffer
	if(	resultBuffer != NULL)
	{
		delete resultBuffer;
		resultBuffer = NULL;
	}

	resultBuffer = new CFloatPBuffer(Width, Height);
	resultBuffer->Initialize();
	resultBuffer->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, 1, 0, 1, 0.0, 1.0 );
	glMatrixMode ( GL_MODELVIEW );
	glLoadIdentity();

	//////////////////////////////////////////////////////////////////////////////
	////	vector + vector		......1
	coefficient_x = 1.0;
	coefficient_y = 1.0;
TEST_RESULT_START
	//for(int k=0;k<30;k++)
		clVecOpFP(CL_VECT_SUB_VECT_RECT,  coefficient_x, coefficient_y, x, y, Vresult);
TEST_RESULT_END
	/////////////////////////////////////////////////////////////
	/////// Use float PBuffer to sever the result
	resultBuffer->EndCapture();

	FILE *fp = fopen("testTime.txt","w");
	fprintf(fp,"time = %f\n", time_cost/30);

	int Dim_Vector;

	float *vx = x.GetData(Dim_Vector);

	float *vy = y.GetData(Dim_Vector);

TEST_RESULT_START	
	float *vr = Vresult.GetData(Dim_Vector);
TEST_RESULT_END

	float diff = 0;
	float result ;
	for(i=0;i<Dim_Vector;i++)
	{
		result = coefficient_x*vx[i] - coefficient_y*vy[i];
		fprintf(fp,"result%i from GPU = %f, from CPU = %f\n",i, vr[i], result);
		diff += vr[i] - result;
	}	
	
	fprintf(fp,"GPU - CPU = %f ",diff);
	fclose(fp);
	
	delete[] vx;
	vx = NULL;	
	
	delete[] vy;
	vy = NULL;

	delete[] vr;
	vr = NULL;

	delete[] Vx;
	delete[] Vy;

	return;
}

void TestclVecReduceFP()
{
	CVectorOnGPU x;
	int i;

	float *Vx = new float[DIM_TEST];
	/////input data
	for(i=0;i<DIM_TEST;i++)
	{
		Vx[i] = 0.5;
	}
	///////////////////////////////////////////////////////
	//// Initialize vectors and matrix

	x.SetData(Vx,DIM_TEST);
	
  	int Width = x.GetWidth();
	int Height = x.GetHeight();

	////// Render To Texture with Float PBuffer
	if(	resultBuffer != NULL)
	{
		delete resultBuffer;
		resultBuffer = NULL;
	}

	resultBuffer = new CFloatPBuffer(Width, Height);
	resultBuffer->Initialize();
	resultBuffer->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, 1, 0, 1, -1.0, 1.0 );
	glMatrixMode ( GL_MODELVIEW );
	glLoadIdentity();

	float result;
TEST_RESULT_START
	//for(int k=0;k<30;k++)
		result = clVecReduceFP(CL_VECT_NORMAL_RECT, x);
TEST_RESULT_END

	/////////////////////////////////////////////////////////////
	/////// Use float PBuffer to sever the result
	resultBuffer->EndCapture();

	int Dim_Vector;
	FILE *fp = fopen("testTime.txt","w");
	fprintf(fp,"time = %f\n", time_cost/30);

	//but current implementation will change the values stored in X
	float *vx = x.GetData(Dim_Vector);
	float tmp=0;
	for(i=0;i<Dim_Vector;i++)
	{ 
		//if(tmp<vx[i])
		fprintf(fp, "=%f\n", vx[i]);
		tmp += vx[i];
	}
	fprintf(fp, "result on CPU=%f\n", tmp);
	fprintf(fp, "result on GPU=%f\n", result);
		
	fclose(fp);

	delete[] vx;
	vx = NULL;	

	delete[] Vx;

	return;
}

void TestclInnerProductFP()
{
	CVectorOnGPU x ,y;
	int i;

	float *Vx = new float[DIM_TEST];
	float *Vy = new float[DIM_TEST];
	/////input data
	for(i=0;i<DIM_TEST;i++)
	{
		Vx[i] = 1;
		Vy[i] = 1;
	}
	///////////////////////////////////////////////////////
	//// Initialize vectors and matrix

TEST_RESULT_START
	x.SetData(Vx,DIM_TEST);
	y.SetData(Vy,DIM_TEST);
TEST_RESULT_END

	int Width = x.GetWidth();
	int Height = x.GetHeight();

	////// Render To Texture with Float PBuffer
	if(	resultBuffer != NULL)
	{
		delete resultBuffer;
		resultBuffer = NULL;
	}

	resultBuffer = new CFloatPBuffer(Width, Height);
	resultBuffer->Initialize();
	resultBuffer->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();

	float result = clInnerProductFP(x, y);

	/////////////////////////////////////////////////////////////
	/////// Use float PBuffer to sever the result
	resultBuffer->EndCapture();

	int Dim_Vector;
	FILE *fpTimeFile = fopen ("testTime.txt", "w");
	float *vx = x.GetData(Dim_Vector);
	fprintf(fpTimeFile,"\nAfter Texture Input data x(Dim=%d):\n", Dim_Vector);
	for(i=0;i<Dim_Vector;i++)
	{
		fprintf(fpTimeFile,"%4.3f ",vx[i]);
	}

	float *vy = y.GetData(Dim_Vector);
	fprintf(fpTimeFile,"\nAfter Texture Input data y(Dim=%d):\n", Dim_Vector);
	for(i=0;i<Dim_Vector;i++)
	{
		fprintf(fpTimeFile,"%4.3f ",vy[i]);
	}
	
	float tmp = 0;
	for(i=0;i<Dim_Vector;i++)
	{
		tmp += vy[i]*vx[i];
	}

	fprintf(fpTimeFile, "\nresult on CPU=%f", tmp);
	fprintf(fpTimeFile, "\nresult on GPU=%f", result);


	delete[] vx;
	vx = NULL;	
	
	delete[] vy;
	vy = NULL;

	fclose(fpTimeFile);

	delete[] Vx;
	delete[] Vy;

	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -