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

📄 makeloops.cpp

📁 A C++ class library for scientific computing
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	"\n"	"    bench.setParameterVector(parameters);\n"	"    bench.setIterations(iters);\n"	"    bench.setFlopsPerIteration(flops);\n"	"\n"	"    bench.beginBenchmarking();" << endl << endl;	// Create literals	for (int i=0; i < lp.numScalars(); ++i) {		ofs << "    " << numtype << " " << lp.scalarName(i)		<< " = 0.39123982498157938742;" << endl;	}	ofs << endl;	ofs.flush();	// Create a string with a list of arguments for the scalars	ostrstream tmpbuf2;	for (int i=0; i < lp.numScalars(); ++i) {		tmpbuf2 << ", " << lp.scalarName(i);	}	tmpbuf2 << '\0';	char* scalarArgs2 = tmpbuf2.str();	ofs << "    VectorVersion(bench" << scalarArgs2 << ");" << endl	<< "    ArrayVersion(bench" << scalarArgs2 << ");" << endl	<< "    F77Version(bench" << scalarArgs2 << ");" << endl	<< "#ifdef FORTRAN_90" << endl	<< "    F90Version(bench" << scalarArgs2 << ");" << endl	<< "#endif" << endl	<< "#ifdef BENCHMARK_VALARRAY" << endl	<< "    ValarrayVersion(bench" << scalarArgs2 << ");" << endl	<< "#endif" << endl << endl <<	"    bench.endBenchmarking();\n"	"\n"	"    bench.saveMatlabGraph(\"" << lp.loopName() << ".m\");\n"	"\n"	"    return 0;\n"	"}\n\n"	"template<class T>\n"	"void initializeRandomDouble(T data, int numElements, int stride = 1)\n"	"{\n"	"    static Random<Uniform> rnd;\n"	"\n"	"    for (int i=0; i < numElements; ++i)\n"	"        data[size_t(i*stride)] = rnd.random();\n"	"}\n"	"\n"	"template<class T>\n"	"void initializeArray(T& array, int numElements)\n"	"{\n"	"    static Random<Uniform> rnd;\n"	"\n"	"    for (size_t i=0; i < numElements; ++i)\n"	"        array[i] = rnd.random();\n"	"}\n\n";	VectorVersion(ofs, lp, numtype, scalarArgs, scalarArgs2);	ArrayVersion(ofs, lp, numtype, scalarArgs, scalarArgs2);	ValarrayVersion(ofs, lp, numtype, scalarArgs, scalarArgs2);	F77Version(ofs, lp, numtype, scalarArgs, scalarArgs2);	F90Version(ofs, lp, numtype, scalarArgs, scalarArgs2);}void writeFortranDecl(ofstream& ofs, const char* version, loop& lp,                      const char* numtype){	ofs << "  void " << lp.loopName() << version	<< "(const int& N";	for (int i=0; i < lp.numArrays(); ++i)		ofs << ", " << numtype << "* " << lp.arrayName(i);	for (int i=0; i < lp.numScalars(); ++i)		ofs << ", const " << numtype << "& " << lp.scalarName(i);	ofs << ");" << endl << endl;}void VectorVersion(ostream& os, loop& lp, const char* numtype,                   const char* scalarArgs, const char* scalarArgs2){	os << "void VectorVersion(BenchmarkExt<int>& bench"	<< scalarArgs << ")\n"	<<	"{\n"	"    bench.beginImplementation(\"Vector<T>\");\n"	"\n"	"    while (!bench.doneImplementationBenchmark())\n"	"    {\n"	"        int N = bench.getParameter();\n"	"        cout << \"Vector<T>: N = \" << N << endl;\n"	"        cout.flush();\n"	"\n"	"        long iters = bench.getIterations();\n"	"\n";	for (int i=0; i < lp.numArrays(); ++i) {		os << "        Vector<" << numtype << "> " << lp.arrayName(i)		<< "(N);" << endl		<< "        initializeRandomDouble(" << lp.arrayName(i) << ".data(), N);" << endl;	}	os << endl <<	"        bench.start();\n"	"        for (long i=0; i < iters; ++i)\n"	"        {\n"	"            ";	const char* loopBuffer = lp.loopBuffer();	for (int i=0; loopBuffer[i]; ++i) {		if (loopBuffer[i] != '$')			os << loopBuffer[i];	}	os << ";" << endl <<	"            sink();\n";	os <<	"        }\n"	"        bench.stop();\n\n"	"        bench.startOverhead();\n"	"        for (long i=0; i < iters; ++i)\n"	"            sink();\n"	"        bench.stopOverhead();\n"	"    }\n"	"\n"	"    bench.endImplementation();\n"	"}" << endl << endl;}void ArrayVersion(ostream& os, loop& lp, const char* numtype,                  const char* scalarArgs, const char* scalarArgs2){	os << "void ArrayVersion(BenchmarkExt<int>& bench"	<< scalarArgs << ")\n"	<<	"{\n"	"    bench.beginImplementation(\"Array<T,1>\");\n"	"\n"	"    while (!bench.doneImplementationBenchmark())\n"	"    {\n"	"        int N = bench.getParameter();\n"	"        cout << \"Array<T,1>: N = \" << N << endl;\n"	"        cout.flush();\n"	"\n"	"        long iters = bench.getIterations();\n"	"\n";	for (int i=0; i < lp.numArrays(); ++i) {		os << "        Array<" << numtype << ", 1> " << lp.arrayName(i)		<< "(N);" << endl		<< "        initializeRandomDouble(" << lp.arrayName(i) << ".dataFirst(), N);" << endl;	}	os << endl <<	"        bench.start();\n"	"        for (long i=0; i < iters; ++i)\n"	"        {\n"	"            ";	const char* loopBuffer = lp.loopBuffer();	for (int i=0; loopBuffer[i]; ++i) {		if (loopBuffer[i] != '$')			os << loopBuffer[i];	}	os << ";" << endl <<	"            sink();\n";	os <<	"        }\n"	"        bench.stop();\n\n"	"        bench.startOverhead();\n"	"        for (long i=0; i < iters; ++i)\n"	"            sink();\n"	"        bench.stopOverhead();\n";	os <<	"    }\n"	"\n"	"    bench.endImplementation();\n"	"}" << endl << endl;}void F77Version(ostream& os, loop& lp, const char* numtype,                const char* scalarArgs, const char* scalarArgs2){	os << "void F77Version(BenchmarkExt<int>& bench"	<< scalarArgs << ")\n"	"{\n"	"    bench.beginImplementation(\"Fortran 77\");\n"	"\n"	"    while (!bench.doneImplementationBenchmark())\n"	"    {\n"	"        int N = bench.getParameter();\n\n"	"        cout << \"Fortran 77: N = \" << N << endl;\n"	"        cout.flush();\n\n"	"        int iters = bench.getIterations();\n"	"\n";	for (int i=0; i < lp.numArrays(); ++i) {		os << "        " << numtype << "* " << lp.arrayName(i)		<< " = new " << numtype << "[N];" << endl		<< "        initializeRandomDouble(" << lp.arrayName(i)		<< ", N);" << endl;	}	os << endl <<	"        bench.start();\n"	"        for (int iter=0; iter < iters; ++iter)\n"	"            " << lp.loopName() << "_f77(N";	for (int i=0; i < lp.numArrays(); ++i)		os << ", " << lp.arrayName(i);	os << scalarArgs2 << ");\n"	"        bench.stop();\n\n"	"        bench.startOverhead();\n"	"        for (int iter=0; iter < iters; ++iter)\n"	"            " << lp.loopName() << "_f77overhead(N";	for (int i=0; i < lp.numArrays(); ++i)		os << ", " << lp.arrayName(i);	os << scalarArgs2 << ");\n";	os << endl <<	"        bench.stopOverhead();\n";	for (int i=0; i < lp.numArrays(); ++i) {		os << "        delete [] " << lp.arrayName(i) << ";" << endl;	}	os << "    }\n"	"\n"	"    bench.endImplementation();\n"	"}\n" << endl;}void F90Version(ostream& os, loop& lp, const char* numtype,                const char* scalarArgs, const char* scalarArgs2){	os << "#ifdef FORTRAN_90" << endl	<< "void F90Version(BenchmarkExt<int>& bench"	<< scalarArgs << ")\n"	"{\n"	"    bench.beginImplementation(\"Fortran 90\");\n"	"\n"	"    while (!bench.doneImplementationBenchmark())\n"	"    {\n"	"        int N = bench.getParameter();\n\n"	"        cout << \"Fortran 90: N = \" << N << endl;\n"	"        cout.flush();\n\n"	"        int iters = bench.getIterations();\n"	"\n";	for (int i=0; i < lp.numArrays(); ++i) {		os << "        " << numtype << "* " << lp.arrayName(i)		<< " = new " << numtype << "[N];" << endl		<< "        initializeRandomDouble(" << lp.arrayName(i)		<< ", N);" << endl;	}	os << endl <<	"        bench.start();\n"	"        for (int iter=0; iter < iters; ++iter)\n"	"            " << lp.loopName() << "_f90(N";	for (int i=0; i < lp.numArrays(); ++i)		os << ", " << lp.arrayName(i);	os << scalarArgs2 << ");\n"	"        bench.stop();\n\n"	"        bench.startOverhead();\n"	"        for (int iter=0; iter < iters; ++iter)\n"	"            " << lp.loopName() << "_f90overhead(N";	for (int i=0; i < lp.numArrays(); ++i)		os << ", " << lp.arrayName(i);	os << scalarArgs2 << ");\n";	os << endl <<	"        bench.stopOverhead();\n";	for (int i=0; i < lp.numArrays(); ++i) {		os << "        delete [] " << lp.arrayName(i) << ";" << endl;	}	os << "    }\n"	"\n"	"    bench.endImplementation();\n"	"}\n"	<< "#endif\n" << endl;}void ValarrayVersion(ostream& os, loop& lp, const char* numtype,                     const char* scalarArgs, const char* scalarArgs2){	os << "#ifdef BENCHMARK_VALARRAY" << endl;	os << "void ValarrayVersion(BenchmarkExt<int>& bench"	<< scalarArgs << ")\n"	<<	"{\n"	"    bench.beginImplementation(\"valarray<T>\");\n"	"\n"	"    while (!bench.doneImplementationBenchmark())\n"	"    {\n"	"        int N = bench.getParameter();\n"	"        cout << \"valarray<T>: N = \" << N << endl;\n"	"        cout.flush();\n"	"\n"	"        long iters = bench.getIterations();\n"	"\n";	for (int i=0; i < lp.numArrays(); ++i) {		os << "        valarray<" << numtype << "> " << lp.arrayName(i)		<< "(N);" << endl		<< "        initializeArray(" << lp.arrayName(i) << ", N);" << endl;	}	os << endl <<	"        bench.start();\n"	"        for (long i=0; i < iters; ++i)\n"	"        {\n"	"            ";	const char* loopBuffer = lp.loopBuffer();	for (int i=0; loopBuffer[i]; ++i) {		if (loopBuffer[i] != '$')			os << loopBuffer[i];	}	os << ";" << endl <<	"            sink();\n";	os <<	"        }\n"	"        bench.stop();\n\n"	"        bench.startOverhead();\n"	"        for (long i=0; i < iters; ++i)\n"	"            sink();\n"	"        bench.stopOverhead();\n"	"    }\n"	"\n"	"    bench.endImplementation();\n"	"}" << endl << endl << "#endif" << endl;}int main(){	ifstream ifs("loops.data");	//ofstream ofs("makefile.inc");	loop lp;	while (!ifs.eof()) {		lp.parseLoop(ifs);		if (ifs.eof())			break;		/*		ofs#ifdef FORTRAN_90		<< lp.loopName() << "f90.o:\t" << lp.loopName() << "f90.f"		<< endl << "\t$(F90) $(F90FLAGS) -c " << lp.loopName() << "f90.f"		<< endl << endl#endif		<< lp.loopName() << ":\t" << lp.loopName() << ".o "		<< lp.loopName() << "f.o "#ifdef FORTRAN_90		<< lp.loopName() << "f90.o"#endif		<< endl		<< "\t$(CXX) $(CXXFLAGS) $(LDFLAGS) -o " << lp.loopName() << " "		<< lp.loopName() << ".o " << lp.loopName() << "f.o "#ifdef FORTRAN_90		<< lp.loopName() << "f90.o "#endif		<< "$(LIBS)" << endl << endl;		*/		fortranVersion(lp);//#ifdef FORTRAN_90		fortran90Version(lp);//#endif		cppVersion(lp);	}	return 0;}

⌨️ 快捷键说明

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