📄 makeloops.cpp
字号:
"\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 + -