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

📄 daxpy.cpp

📁 A C++ class library for scientific computing
💻 CPP
字号:
// In KAI C++ 3.2c, restrict causes problems for copy propagation.// Temporary kludge is to disable use of the restrict keyword.#define BZ_DISABLE_RESTRICT#include <blitz/vector.h>#include <blitz/array.h>#include <blitz/rand-uniform.h>#include <blitz/benchext.h>#ifdef BZ_HAVE_VALARRAY #define BENCHMARK_VALARRAY#endif#ifdef BENCHMARK_VALARRAY#include <valarray>#endifBZ_USING_NAMESPACE(blitz)#if defined(BZ_FORTRAN_SYMBOLS_WITH_TRAILING_UNDERSCORES) #define fdaxpy   fdaxpy_ #define daxpy    daxpy_ #define f90daxpy f90daxpy_ #define fidaxpy  fidaxpy_ #define fidaxpyo fidaxpyo_#elif defined(BZ_FORTRAN_SYMBOLS_WITH_DOUBLE_TRAILING_UNDERSCORES) #define fdaxpy   fdaxpy__ #define daxpy    daxpy__ #define f90daxpy f90daxpy__ #define fidaxpy  fidaxpy__ #define fidaxpyo fidaxpyo__#elif defined(BZ_FORTRAN_SYMBOLS_CAPS) #define fdaxpy   FDAXPY #define daxpy    DAXPY #define f90daxpy F90DAXPY #define fidaxpy  FIDAXPY #define fidaxpyo FIDAXPYO#endifextern "C" {  void fdaxpy(const int& N, const double& da, double* x,    const int& xstride, const double* y, const int& ystride);  void daxpy(const int& N, const double& da, double* x,    const int& xstride, const double* y, const int& ystride);  void f90daxpy(const double& a, double* x,     const double* y, const int& length, const int& iters);  void fidaxpy(const double& a, double* x, const double* y,    const int& length, const int& iters);  void fidaxpyo(const double& a, double* x, const double* y,    const int& length, const int& iters);}void daxpyVectorVersion(BenchmarkExt<int>& bench, double a, double b);void daxpyArrayVersion(BenchmarkExt<int>& bench, double a);void daxpyF77Version(BenchmarkExt<int>& bench, double a);void daxpyBLASVersion(BenchmarkExt<int>& bench, double a);#ifdef FORTRAN_90void daxpyF90Version(BenchmarkExt<int>& bench, double a);#endif#ifdef BENCHMARK_VALARRAYvoid daxpyValarrayVersion(BenchmarkExt<int>& bench, double a);#endifint main(){    int numBenchmarks = 6;#ifndef BENCHMARK_VALARRAY		numBenchmarks--;   // No  valarray#endif#ifndef FORTRAN_90		numBenchmarks--;   // No fortran 90#endif    BenchmarkExt<int> bench("DAXPY Benchmark", numBenchmarks);    const int numSizes = 19;    bench.setNumParameters(numSizes);    bench.setRateDescription("Mflops/s");    Vector<int> parameters(numSizes);    Vector<long> iters(numSizes);    Vector<double> flops(numSizes);    for (int i=0; i < numSizes; ++i)    {        parameters[i] = static_cast<int>(pow(10.0, 0.25*(i+1)));        iters[i] = 50000000L / parameters[i];        if (iters[i] < 2)            iters[i] = 2;        flops[i] = 2 * parameters[i] * 2;    }    bench.setParameterVector(parameters);    bench.setIterations(iters);    bench.setFlopsPerIteration(flops);    bench.beginBenchmarking();    float a = .398498293819823;    daxpyVectorVersion(bench, a, -a);    daxpyArrayVersion(bench, a);    daxpyF77Version(bench, a);    daxpyBLASVersion(bench, a);#ifdef FORTRAN_90    daxpyF90Version(bench, a);#endif#ifdef BENCHMARK_VALARRAY    daxpyValarrayVersion(bench, a);#endif    bench.endBenchmarking();    bench.saveMatlabGraph("daxpy.m");    return 0;}void initializeRandomDouble(double* data, int numElements, int stride = 1){    static Random<Uniform> rnd;    for (int i=0; i < numElements; ++i)        data[i*stride] = rnd.random();}template<class T>void initializeArray(T& array, int numElements){    static Random<Uniform> rnd;    for (size_t i=0; i < numElements; ++i)        array[i] = rnd.random();}void daxpyVectorVersion(BenchmarkExt<int>& bench, double a, double b){    bench.beginImplementation("Vector<T>");    while (!bench.doneImplementationBenchmark())    {        int N = bench.getParameter();        cout << "Vector<T>: N = " << N << endl;        cout.flush();        long iters = bench.getIterations();        Vector<double> x(N), y(N);        initializeRandomDouble(x.data(), N);        initializeRandomDouble(y.data(), N);        bench.start();        for (long i=0; i < iters; ++i)        {             y += a * x;            y += b * x;        }        bench.stop();    }    bench.endImplementation();}void daxpyArrayVersion(BenchmarkExt<int>& bench, double a){    bench.beginImplementation("Array<T,1>");    while (!bench.doneImplementationBenchmark())    {        int N = bench.getParameter();        cout << "Array<T,1>: N = " << N << endl;        cout.flush();        long iters = bench.getIterations();        Array<double,1> x(N), y(N);        initializeRandomDouble(x.data(), N);        initializeRandomDouble(y.data(), N);        double b = - a;        bench.start();        for (long i=0; i < iters; ++i)        {            y += a * x;            y += b * x;        }        bench.stop();    }    bench.endImplementation();}void daxpyF77Version(BenchmarkExt<int>& bench, double a){    bench.beginImplementation("Fortran 77");    while (!bench.doneImplementationBenchmark())    {        int N = bench.getParameter();        cout << "Fortran 77: N = " << N << endl;        cout.flush();        int iters = bench.getIterations();        double* x = new double[N];        double* y = new double[N];        initializeRandomDouble(x, N);        initializeRandomDouble(y, N);        bench.start();        fidaxpy(a, x, y, N, iters);        bench.stop();        delete [] x;        delete [] y;    }    bench.endImplementation();}void daxpyBLASVersion(BenchmarkExt<int>& bench, double a){#ifdef USE_LIBBLAS    bench.beginImplementation("Platform BLAS");#else    bench.beginImplementation("Fortran BLAS");#endif    while (!bench.doneImplementationBenchmark())    {        int N = bench.getParameter();        cout << "Fortran BLAS: N = " << N << endl;        cout.flush();        int iters = bench.getIterations();        double* x = new double[N];        double* y = new double[N];        initializeRandomDouble(x, N);        initializeRandomDouble(y, N);        int xstride = 1, ystride = 1;        double b = - a;        bench.start();        for (long i=0; i < iters; ++i)        {#ifdef USE_LIBBLAS            daxpy(N, a, x, xstride, y, ystride);            daxpy(N, b, x, xstride, y, ystride);#else            fdaxpy(N, a, x, xstride, y, ystride);            fdaxpy(N, b, x, xstride, y, ystride);#endif        }        bench.stop();        delete [] x;        delete [] y;    }    bench.endImplementation();}#ifdef FORTRAN_90void daxpyF90Version(BenchmarkExt<int>& bench, double a){    bench.beginImplementation("Fortran 90");    while (!bench.doneImplementationBenchmark())    {        int N = bench.getParameter();        cout << "Fortran 90: N = " << N << endl;        cout.flush();        int iters = bench.getIterations();        double* x = new double[N];        double* y = new double[N];        initializeRandomDouble(x, N);        initializeRandomDouble(y, N);        bench.start();        f90daxpy(a, x, y, N, iters);        bench.stop();        delete [] x;        delete [] y;    }    bench.endImplementation();}#endif#ifdef BENCHMARK_VALARRAYvoid daxpyValarrayVersion(BenchmarkExt<int>& bench, double a){    bench.beginImplementation("valarray<T>");    while (!bench.doneImplementationBenchmark())    {        int N = bench.getParameter();        cout << "valarray<T>: N = " << N << endl;        cout.flush();        long iters = bench.getIterations();        valarray<double> x(N), y(N);        initializeArray(x, N);        initializeArray(y, N);        double b = - a;        bench.start();        for (long i=0; i < iters; ++i)        {            y += a * x;            y += b * x;        }        bench.stop();    }    bench.endImplementation();}#endif

⌨️ 快捷键说明

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