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

📄 testsparsematrixvector1.cpp

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

#include "stdafx.h"
#include "shadow.h"
#include "TestSparseMatrixVector1.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

////////////////////////////////////////////////////
//// Test Sparse Matrix * Vector Operation
////////////////////////////////////////////////////
#include "CommonHW.h"
#include "pbuffer.h"

#include "VectorOnGPU.h"
#include "SparseMatrixOnGPU1.h"
#include "SparseMatrixVectorMultiply1.h"
void TestBolzSparseMatVec()
{
	CBolzMatrix A;
	CVectorOnGPU x, result;

	int i,j,k=0;
	int dim = 1024;//4;//
/*
	float M[] = {3,0,0,2,
				 0,0,0,1,
				 0,4,0,0,
				 6,2,3,8};
	float vx[] = {8,3,6,2};
	float Vr[4];
*/
	float *M = new float[dim*dim];
	for(i=0;i<dim;i++)
	{
		for(j=0;j<dim;j++)
		{
			M[i*dim+j] = (float)rand()/RAND_MAX;
			if( i > j+5 || j > i+5)
			{
				M[i*dim+j] = 0;
				k++;
			}
		}
	}
	float *vx = new float[dim];
	float *Vr = new float[dim];
	for(i=0;i<dim;i++)
		vx[i] = (float)rand()/RAND_MAX;

	//A.SetMultiData(M, dim);
	A.SetData(M, dim);
	x.SetData(vx, dim);
	result.SetData(NULL, dim);	
	
	int Width = x.GetWidth();
	int Height = x.GetHeight();

	////// Render To Texture with Float PBuffer
	for(i=0;i<2;i++)
	{
		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();
	}

	//A.SetMultiData(M, dim);
	//A.SetData(M, dim);
	//x.SetData(vx, dim);
	//result.SetData(NULL, dim);	

TEST_RESULT_START	
	for(i=0;i<30;i++)
		BolzSparseMatVect(A, x, result);
		//MultiBolzSparseMatVect(A, x, result);
TEST_RESULT_END


	float *vr = result.GetData(dim);

	///////Verify the result
	FILE *fp = fopen("testTime.txt","w");
	fprintf(fp,"time = %f\n", time_cost/30);
	fprintf(fp,"zero number= %d, ratio=%f\n", k, (float)k/(dim*dim));

TEST_RESULT_START	
	float diff = 0;
	for(i=0;i<dim;i++)
	{
		Vr[i] = 0;
		for(j=0;j<dim;j++)
			Vr[i] += M[i*dim+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);
	fprintf(fp,"PassNum = %d\n", A.GetPassNum());
	fclose(fp);

	
}

⌨️ 快捷键说明

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