#include #include #include #include #include #include #include #include using namespace std; // Compile with: // // c++ -std=c++17 accelerate_gemv.cpp \ // -framework Accelerate \ // -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Headers/ int main(int, char **) { int iters = 1000; int m = 1; /* int n = 2048; */ int n = 51865; int k = 512; int lda = n; int incx = 1; float alpha = 1.; float beta = 0.; int incy = 1; random_device rnd_device; mt19937 mersenne_engine{rnd_device()}; uniform_int_distribution dist{1, 52}; auto gen = [&dist, &mersenne_engine]() { return dist(mersenne_engine); }; vector a(n * k); generate(begin(a), end(a), gen); vector x(k); generate(begin(x), end(x), gen); vector y(n); auto start = std::chrono::steady_clock::now(); for (int i = 0; i < iters; i++) { cblas_sgemv(CblasRowMajor, CblasNoTrans, k, n, alpha, a.data(), lda, x.data(), incx, beta, y.data(), incy); } auto end = std::chrono::steady_clock::now(); auto duration = std::chrono::duration_cast(end - start) .count(); auto flops = static_cast(2 * m * n * k * static_cast(iters)) / (static_cast(duration) / 1000000.0); auto gflops = flops / 1e9; std::cout << "duration (s) " << duration << std::endl; std::cout << "gflops " << gflops << std::endl; }