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

📄 makeloops.cpp

📁 A C++ class library for scientific computing
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <iostream.h>#include <string.h>#include <fstream.h>#include <stdlib.h>#include <strstream.h>#include <iostream.h>#include <stdio.h>#include <ctype.h>class loop{public:	loop()	{		reset();	}	void reset();	void parseLoop(istream& is);	int numArrays() const	{		return numArrays_;	}	char arrayName(int i) const	{		return arrays_[i];	}	int numScalars() const	{		return numScalars_;	}	char scalarName(int i) const	{		return scalars_[i];	}	const char* loopName() const	{		return loopName_;	}	const char* loopBuffer() const	{		return loopBuffer_;	}	int flops() const	{		return flops_;	}	int isArray(char c) const	{		for (int i=0; i < numArrays_; ++i)			if (arrays_[i] == c)				return 1;		return 0;	}	int isScalar(char c) const	{		for (int i=0; i < numScalars_; ++i)			if (scalars_[i] == c)				return 1;		return 0;	}private:	enum { maxArrays = 20, maxScalars = 20, bufLen = 128 };	char arrays_[maxArrays];	int numArrays_;	char scalars_[maxScalars];	int numScalars_;	char loopBuffer_[bufLen];	char loopName_[bufLen];	int flops_;};void loop::reset(){	numArrays_ = 0;	numScalars_ = 0;	loopBuffer_[0] = '\0';	loopName_[0] = '\0';	flops_ = 0;}void loop::parseLoop(istream& is){	const int bufLen = 128;	char buffer[bufLen];	const char* whitespace = " \t";	reset();	while (!is.eof()) {		is.getline(buffer, bufLen);		char* token = strtok(buffer, whitespace);		if (!token)			continue;		if (!strcmp(token, "begin")) {			token = strtok(0, whitespace);			strcpy(loopName_, token);			cout << "Creating loop: " << loopName_ << endl;		} else if (!strcmp(token, "end"))			return;		else if (!strcmp(token, "array")) {			while (token = strtok(0, whitespace)) {				arrays_[numArrays_++] = token[0];				cout << "Array: " << token[0] << endl;			}		} else if (!strcmp(token, "scalar")) {			while (token = strtok(0, whitespace)) {				scalars_[numScalars_++] = token[0];				cout << "Scalar: " << token[0] << endl;			}		} else if (!strcmp(token, "flops")) {			token = strtok(0, whitespace);			flops_ = atoi(token);			cout << "Flops: " << flops_ << endl;		} else if (!strcmp(token, "loop")) {			loopBuffer_[0] = '\0';			while (token = strtok(0, whitespace))				strcat(loopBuffer_, token);			cout << "Loop: " << loopBuffer_ << endl;		}	}}void fortranVersion(loop& lp){	const char* numtype = "REAL*8";	char filename[128];	sprintf(filename, "%sf.f", lp.loopName());	ofstream ofs(filename);	ofs << "      SUBROUTINE " << lp.loopName() << "_F77(N";	for (int i=0; i < lp.numArrays(); ++i)		ofs << ", " << lp.arrayName(i);	for (int i=0; i < lp.numScalars(); ++i)		ofs << ", " << lp.scalarName(i);	ofs << ")" << endl	<< "      INTEGER i, N" << endl	<< "      " << numtype << " " << lp.arrayName(0) << "(N)";	for (int i=1; i < lp.numArrays(); ++i)		ofs << ", " << lp.arrayName(i) << "(N)";	for (int i=0; i < lp.numScalars(); ++i)		ofs << ", " << lp.scalarName(i);	ofs << endl << endl	<< "      DO i=1,N" << endl	<< "          ";	const char* loopBuffer = lp.loopBuffer();	for (int i=0; loopBuffer[i]; ++i) {		if (loopBuffer[i] == ';')			ofs << endl << "          ";		else if (loopBuffer[i] != '$')			ofs << loopBuffer[i];		else {			++i;			if (lp.isArray(loopBuffer[i]))				ofs << loopBuffer[i] << "(i)";			else if (lp.isScalar(loopBuffer[i]))				ofs << loopBuffer[i];		}	}	ofs << endl	<< "      END DO" << endl;	ofs << "      RETURN" << endl	<< "      END" << endl;	ofs << endl << endl	<< "      SUBROUTINE " << lp.loopName() << "_F77Overhead(N";	for (int i=0; i < lp.numArrays(); ++i)		ofs << ", " << lp.arrayName(i);	for (int i=0; i < lp.numScalars(); ++i)		ofs << ", " << lp.scalarName(i);	ofs << ")" << endl	<< "      INTEGER i, N" << endl	<< "      " << numtype << " " << lp.arrayName(0) << "(N)";	for (int i=1; i < lp.numArrays(); ++i)		ofs << ", " << lp.arrayName(i) << "(N)";	for (int i=0; i < lp.numScalars(); ++i)		ofs << ", " << lp.scalarName(i);	ofs << endl	<< "      RETURN" << endl	<< "      END" << endl;}void fortran90Version(loop& lp){	const char* numtype = "REAL*8";	char filename[128];	sprintf(filename, "%sf90.f90", lp.loopName());	ofstream ofs(filename);	ofs << "      SUBROUTINE " << lp.loopName() << "_F90(N";	for (int i=0; i < lp.numArrays(); ++i)		ofs << ", " << lp.arrayName(i);	for (int i=0; i < lp.numScalars(); ++i)		ofs << ", " << lp.scalarName(i);	ofs << ")" << endl	<< "      INTEGER i, N" << endl	<< "      " << numtype << " " << lp.arrayName(0) << "(N)";	for (int i=1; i < lp.numArrays(); ++i)		ofs << ", " << lp.arrayName(i) << "(N)";	for (int i=0; i < lp.numScalars(); ++i)		ofs << ", " << lp.scalarName(i);	ofs << endl << endl	<< "      ";	const char* loopBuffer = lp.loopBuffer();	for (int i=0; loopBuffer[i]; ++i) {		if (loopBuffer[i] == ';')			ofs << endl << "        ";		else if (loopBuffer[i] != '$')			ofs << loopBuffer[i];	}	ofs << endl	<< "      RETURN" << endl	<< "      END" << endl;	ofs << endl << endl	<< "      SUBROUTINE " << lp.loopName() << "_F90Overhead(N";	for (int i=0; i < lp.numArrays(); ++i)		ofs << ", " << lp.arrayName(i);	for (int i=0; i < lp.numScalars(); ++i)		ofs << ", " << lp.scalarName(i);	ofs << ")" << endl	<< "      INTEGER i, N" << endl	<< "      " << numtype << " " << lp.arrayName(0) << "(N)";	for (int i=1; i < lp.numArrays(); ++i)		ofs << ", " << lp.arrayName(i) << "(N)";	for (int i=0; i < lp.numScalars(); ++i)		ofs << ", " << lp.scalarName(i);	ofs << endl << endl	<< "      RETURN" << endl	<< "      END" << endl;}void writeFortranDecl(ofstream& ofs, const char* version, loop& lp,                      const char* numtype);void VectorVersion(ostream& os, loop& lp, const char* numtype,                   const char* scalarArgs, const char* scalarArgs2);void ArrayVersion(ostream& os, loop& lp, const char* numtype,                  const char* scalarArgs, const char* scalarArgs2);void ValarrayVersion(ostream& os, loop& lp, const char* numtype,                     const char* scalarArgs, const char* scalarArgs2);void F77Version(ostream& os, loop& lp, const char* numtype,                const char* scalarArgs, const char* scalarArgs2);void F90Version(ostream& os, loop& lp, const char* numtype,                const char* scalarArgs, const char* scalarArgs2);void cppVersion(loop& lp){	const char* numtype = "double";	char filename[128];	sprintf(filename, "%s.cpp", lp.loopName());	ofstream ofs(filename);	char capsLoopName[128];	for (int i=0; i <= strlen(lp.loopName()); ++i)		capsLoopName[i] = toupper(lp.loopName()[i]);	ofs << "// Generated code (makeloops.cpp) -- do not edit." << endl << endl	<< "// In KAI C++ 3.2, restrict causes problems for copy propagation."	<< endl << "// Temporary fix: disable restrict" << endl << endl	<< "#define BZ_DISABLE_RESTRICT" << endl << endl	<<	"#include <blitz/vector.h>\n"	"#include <blitz/array.h>\n"	"#include <blitz/rand-uniform.h>\n"	"#include <blitz/benchext.h>\n"	"\n"	"// Generated: " << __FILE__ << " " << __DATE__ << endl << endl <<	"#ifdef BZ_HAVE_VALARRAY\n"	" #define BENCHMARK_VALARRAY\n"	"#endif\n\n"	"#ifdef BENCHMARK_VALARRAY\n"	"#include <valarray>\n"	"#endif\n"	"\n"	"BZ_USING_NAMESPACE(blitz)\n"	"\n"	"#if defined(BZ_FORTRAN_SYMBOLS_WITH_TRAILING_UNDERSCORES)\n"	" #define " << lp.loopName() << "_f77 " << lp.loopName() << "_f77_\n"	" #define " << lp.loopName() << "_f77overhead " << lp.loopName() << "_f77overhead_\n"	" #define " << lp.loopName() << "_f90 " << lp.loopName() << "_f90_\n"	" #define " << lp.loopName() << "_f90overhead " << lp.loopName() << "_f90overhead_\n"	"#elif defined(BZ_FORTRAN_SYMBOLS_WITH_DOUBLE_TRAILING_UNDERSCORES)\n"	" #define " << lp.loopName() << "_f77 " << lp.loopName() << "_f77__\n"	" #define " << lp.loopName() << "_f77overhead " << lp.loopName() << "_f77overhead__\n"	" #define " << lp.loopName() << "_f90 " << lp.loopName() << "_f90__\n"	" #define " << lp.loopName() << "_f90overhead " << lp.loopName() << "_f90overhead__\n"	"#elif defined(BZ_FORTRAN_SYMBOLS_CAPS)\n"	" #define " << lp.loopName() << "_f77 " << capsLoopName << "_F77\n"	" #define " << lp.loopName() << "_f77overhead " << capsLoopName << "_F77OVERHEAD\n"	" #define " << lp.loopName() << "_f90 " << capsLoopName << "_F90\n"	" #define " << lp.loopName() << "_f90overhead " << capsLoopName << "_F90OVERHEAD\n"	"#endif\n"	"\n"	"extern \"C\" {" << endl;	writeFortranDecl(ofs, "_f77", lp, numtype);	writeFortranDecl(ofs, "_f77overhead", lp, numtype);	writeFortranDecl(ofs, "_f90", lp, numtype);	writeFortranDecl(ofs, "_f90overhead", lp, numtype);	ofs << "}" << endl << endl;	// Create a string with a list of arguments for the scalars	ostrstream tmpbuf;	for (int i=0; i < lp.numScalars(); ++i) {		tmpbuf << ", " << numtype << " " << lp.scalarName(i);	}	tmpbuf << '\0';	const char* scalarArgs = tmpbuf.str();	ofs << "void VectorVersion(BenchmarkExt<int>& bench"	<< scalarArgs << ");" << endl	<< "void ArrayVersion(BenchmarkExt<int>& bench"	<< scalarArgs << ");" << endl	<< "void F77Version(BenchmarkExt<int>& bench"	<< scalarArgs << ");" << endl	<< "#ifdef FORTRAN_90" << endl	<< "void F90Version(BenchmarkExt<int>& bench"	<< scalarArgs << ");" << endl	<< "#endif" << endl	<< "#ifdef BENCHMARK_VALARRAY" << endl	<< "void ValarrayVersion(BenchmarkExt<int>& bench"	<< scalarArgs << ");" << endl << "#endif" << endl << endl;	ofs << "void sink() {}\n\n";	ofs << "int main()\n"	"{\n"	"    int numBenchmarks = 5;\n"	"#ifndef BENCHMARK_VALARRAY\n"	"    numBenchmarks--;   // No  valarray\n"	"#endif\n"	"#ifndef FORTRAN_90\n"	"    numBenchmarks--;   // No fortran 90\n"	"#endif\n"	"\n"	"    BenchmarkExt<int> bench(\"" << lp.loopName() << ": "	<< lp.loopBuffer() << "\", numBenchmarks);\n"	"\n"	"    const int numSizes = 23;\n"	"    bench.setNumParameters(numSizes);\n"	"    bench.setRateDescription(\"Mflops/s\");\n"	"\n"	"    Vector<int> parameters(numSizes);\n"	"    Vector<long> iters(numSizes);\n"	"    Vector<double> flops(numSizes);\n"	"\n"	"    for (int i=0; i < numSizes; ++i)\n"	"    {\n"	"        parameters[i] = (int)pow(10.0, (i+1)/4.0);\n"	"        iters[i] = 10000000L / parameters[i];\n"	"        if (iters[i] < 2)\n"	"            iters[i] = 2;\n"	"        flops[i] = " << lp.flops() << " * parameters[i];\n"	"    }\n"

⌨️ 快捷键说明

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