📄 hao-he.cpp
字号:
/*
* This benchmark times the performance of B += sqr(A), where A and B
* are complex<double> arrays.
*
* Note: need to use -mv8 for SPARC v8.
*/
#include <blitz/array.h>
#include <blitz/timer.h>
BZ_USING_NAMESPACE(blitz)
#include <blitz/vector.h>
typedef Array<complex<double>,1> CArray;
void setup(Array<complex<double>,1>& A, Array<complex<double>,1>& B)
{
int n = A.extent(firstDim);
for (int i=0; i < n; ++i)
{
double x=-10.+20./(n-1.0)*i;
A(i)=sin(x);
B(i)=sin(x);
}
}
void version1(CArray& A, CArray& B, int nIters)
{
Timer timer;
// Array notation
setup(A, B);
timer.start();
for (int i=0; i < nIters; ++i)
{
B += A*A;
}
timer.stop();
cout << "Time using array notation b += a*a: " << timer.elapsedSeconds()
<< endl;
}
void version2(CArray& A, CArray& B, int nIters)
{
// Array notation, using sqr(a)
Timer timer;
setup(A,B);
timer.start();
for (int i=0; i < nIters; ++i)
{
B += sqr(A);
}
timer.stop();
cout << "Time using array notation b += sqr(a): " << timer.elapsedSeconds()
<< endl;
}
void version2c(CArray& A, CArray& B)
{
B += sqr(A);
}
void version2b(CArray& A, CArray& B, int nIters)
{
// Array notation, using sqr(a)
Timer timer;
setup(A,B);
timer.start();
for (int i=0; i < nIters; ++i)
{
version2c(A,B);
}
timer.stop();
cout << "Time using array notation b += sqr(a): " << timer.elapsedSeconds()
<< endl;
}
void version3(CArray& A, CArray& B, int nIters)
{
Timer timer;
int N = A.extent(firstDim);
// Low-level implementation
setup(A,B);
timer.start();
for (int i=0; i < nIters; ++i)
{
for (int j=0; j < N; ++j)
B(j) += A(j) * A(j);
}
timer.stop();
cout << "Time using low-level version: " << timer.elapsedSeconds()
<< endl;
}
void version4(CArray& A, CArray& B, int nIters)
{
Timer timer;
struct cmplx {
double re, im;
};
cmplx* a = (cmplx*)A.data();
cmplx* b = (cmplx*)B.data();
setup(A,B);
int N = A.extent(firstDim);
timer.start();
for (int i=0; i < nIters; ++i)
{
for (int j=0; j < N; ++j)
{
double ar = a[j].re;
double ai = a[j].im;
b[j].re += ar*ar - ai*ai;
b[j].im += 2 * ar * ai;
}
}
timer.stop();
cout << "Time using really low-level version: " << timer.elapsedSeconds()
<< endl;
}
int run(int N, int nIters)
{
Array<complex<double>,1> A(N), B(N);
version1(A,B,nIters);
version2(A,B,nIters);
version2b(A,B,nIters);
version3(A,B,nIters);
version4(A,B,nIters);
return 0;
}
int main()
{
cout << "In-cache:" << endl;
run(256,39063);
cout << endl << "Out-of-cache:" << endl;
run(1000000,10);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -