Průměrně líný programátor v C++ použije tohle:
#include <boost/numeric/ublas/matrix.hpp>
#include <random>
int main()
{
boost::numeric::ublas::matrix<int> m1(100, 100);
boost::numeric::ublas::matrix<int> m2(100, 100);
std::random_device rnd;
for (unsigned i = 0; i < m1.size1(); ++i)
for (unsigned j = 0; j < m1.size2(); ++j)
m1(i, j) = m2(i, j) = rnd() % 10;
for (int i = 0; i < 1000000; ++i)
m1 += m2;
return 0;
}
Zkompilované bez debugů:
g++ -O3 -std=c++0x -DBOOST_UBLAS_NDEBUG main.cc -o main
Je to o 25% pomalejší než Stenův ručně optimalizovaný kód, což mi přijde jako akceptovatelná cena za obecnost matice a za 2D reprezentaci v paměti. Mimochodem jak někdo psal, že v C++ se neprovedou SIMD optimalizace, není to pravda, počítá se to SIMD instrukcemi:
.L28:
movdqu (%rax,%rcx), %xmm1
movdqu (%rax,%rdx), %xmm0
paddd %xmm1, %xmm0
movdqa %xmm0, (%rdx,%rax)
addq $16, %rax
cmpq $400, %rax
jne .L28