Esempio n. 1
0
static D hypoth(D u,D v){D p,q,t; MMM(u,v); R INF(p)?inf:p?(t=q/p,p*sqrt(1+t*t)):0;}
Esempio n. 2
0
int main(int argc, char **argv) {
	///******************************************************
	///********************** INPUT *************************
	///******************************************************
	if (argc != 4) {
		std::cout << "Invalid number of arguments!" << std::endl;
		std::cout << "./compare A.out B.out" << std::endl;
		exit(EXIT_FAILURE);
	}

	//matrix dimensions
	int dimM = 0;
	int dimN = 0;
	int dimO = 0;

	//get dimensions
	std::ifstream	fIn(argv[1]);
	if (!fIn) {
		std::cout << "Error opening file: " << argv[1] << std::endl;
		exit(EXIT_FAILURE);
	}

	if(!(fIn >> dimM >> dimN))
	{
		std::cout << "Error in reading matrix entries!" << std::endl;
		exit(EXIT_FAILURE);
	}
	fIn.close();

	fIn.open(argv[2]);
	if (!fIn) {
		std::cout << "Error opening file: " << argv[2] << std::endl;
		exit(EXIT_FAILURE);
	}

	if(!(fIn >> dimN >> dimO))
	{
		std::cout << "Error in reading matrix entries!" << std::endl;
		exit(EXIT_FAILURE);
	}

	fIn.close();

	//calculate minimal matrix size
	//all matrices are padded with 0s to this size
	//should be power of 2 for efficient block division
	//dirty hack...
	LD = 64;
	if (LD<dimM) LD = dimM;
	if (LD<dimN) LD = dimN;
	if (LD<dimO) LD = dimO;

	LD--;
	LD |= LD >> 1;
	LD |= LD >> 2;
	LD |= LD >> 4;
	LD |= LD >> 8;
	LD |= LD >> 16;
	LD++;

	//add useless padding
	LD += PADDING;

	double* a = (double*) aligned_alloc(ALIGNMENT, sizeof(double) * LD * LD);
	double* b = (double*) aligned_alloc(ALIGNMENT, sizeof(double) * LD * LD);
	double* c = (double*) aligned_alloc(ALIGNMENT, sizeof(double) * LD * LD);

	Matrix	A = loadMatrix(argv[1], &a[0]);
	Matrix	B = loadMatrix(argv[2], &b[0]);
	Matrix	C(&c[0], nullptr, A.getDimM(), B.getDimN(), 0, 0);

	///******************************************************
	///********************** CALCULATION *******************
	///******************************************************
	double time = 0;
	
#ifdef USE_LIKWID
	likwid_markerInit();
	likwid_markerStartRegion("dummy");
#endif

	siwir::Timer	timer;

	MMM(A, B, C);

	time = timer.elapsed();
	std::cout << dimM << "\t" << dimN << "\t" << dimO << "\t" << time << std::endl;

#ifdef USE_LIKWID
	likwid_markerStopRegion("dummy");
	likwid_markerClose();
#endif

	///******************************************************
	///********************** OUTPUT ************************
	///******************************************************

	saveMatrix(argv[3], C);

	free(a);
	free(b);
	free(c);
};
Esempio n. 3
0
void
quat_mat2quat(register fastf_t *quat, register const fastf_t *mat)
{
    fastf_t		tr;
    fastf_t	s;

#define XX	0
#define YY	5
#define ZZ	10
#define MMM(a, b)		mat[4*(a)+(b)]

    tr = mat[XX] + mat[YY] + mat[ZZ];
    if ( tr > 0.0 )  {
	s = sqrt( tr + 1.0 );
	quat[W] = s * 0.5;
	s = 0.5 / s;
	quat[X] = ( mat[6] - mat[9] ) * s;
	quat[Y] = ( mat[8] - mat[2] ) * s;
	quat[Z] = ( mat[1] - mat[4] ) * s;
	return;
    }

    /* Find dominant element of primary diagonal */
    if ( mat[YY] > mat[XX] )  {
	if ( mat[ZZ] > mat[YY] )  {
	    s = sqrt( MMM(Z, Z) - (MMM(X, X)+MMM(Y, Y)) + 1.0 );
	    quat[Z] = s * 0.5;
	    s = 0.5 / s;
	    quat[W] = (MMM(X, Y) - MMM(Y, X)) * s;
	    quat[X] = (MMM(Z, X) + MMM(X, Z)) * s;
	    quat[Y] = (MMM(Z, Y) + MMM(Y, Z)) * s;
	} else {
	    s = sqrt( MMM(Y, Y) - (MMM(Z, Z)+MMM(X, X)) + 1.0 );
	    quat[Y] = s * 0.5;
	    s = 0.5 / s;
	    quat[W] = (MMM(Z, X) - MMM(X, Z)) * s;
	    quat[Z] = (MMM(Y, Z) + MMM(Z, Y)) * s;
	    quat[X] = (MMM(Y, X) + MMM(X, Y)) * s;
	}
    } else {
	if ( mat[ZZ] > mat[XX] )  {
	    s = sqrt( MMM(Z, Z) - (MMM(X, X)+MMM(Y, Y)) + 1.0 );
	    quat[Z] = s * 0.5;
	    s = 0.5 / s;
	    quat[W] = (MMM(X, Y) - MMM(Y, X)) * s;
	    quat[X] = (MMM(Z, X) + MMM(X, Z)) * s;
	    quat[Y] = (MMM(Z, Y) + MMM(Y, Z)) * s;
	} else {
	    s = sqrt( MMM(X, X) - (MMM(Y, Y)+MMM(Z, Z)) + 1.0 );
	    quat[X] = s * 0.5;
	    s = 0.5 / s;
	    quat[W] = (MMM(Y, Z) - MMM(Z, Y)) * s;
	    quat[Y] = (MMM(X, Y) + MMM(Y, X)) * s;
	    quat[Z] = (MMM(X, Z) + MMM(Z, X)) * s;
	}
    }
#undef MMM
}