Я еще раз взглянул на это и понял, что лучший способ ускорить его - переписать
for (size_t i = 0; i < kRuns; ++i) {
c = c + (a + b) * 0.5f;
}
в
c = c + kRuns * ( a + b ) * 0.5f
, что совсем не требует времени.
Когда я передаю код с использованием простых массивов, мой оптимизирующий компилятор, очевидно, делает это для «цикла», который выполняется миллион раз за слишком короткое время для измерения.
float a[3], b[3], c[3];
a[0] = 1.0f, a[1] = 2.0f, a[2] = 3.0f;
b[0] = 2.0f, b[1] = 3.0f, b[2] = 1.0f;
c[0] = 6.0f, c[1] = 4.0f, c[2] = 5.0f;
for (size_t i = 0; i < KRUNS; ++i) {
c[0] = c[0] + ( a[0] + b[0] ) * 0.5;
c[1] = c[1] + ( a[1] + b[1] ) * 0.5;
c[2] = c[2] + ( a[2] + b[2] ) * 0.5;
}
Не твой?
Использование библиотеки ublas не позволяет оптимизатору делать свое дело. Запуск этого кода
#define KRUNS 1000000
typedef boost::numeric::ublas::vector<float,
boost::numeric::ublas::bounded_array<float, 3> > MYVECTOR3;
MYVECTOR3 a(3), b(3), c(3);
a[0] = 1.0f, a[1] = 2.0f, a[2] = 3.0f;
b[0] = 2.0f, b[1] = 3.0f, b[2] = 1.0f;
c[0] = 6.0f, c[1] = 4.0f, c[2] = 5.0f;
for (size_t i = 0; i < KRUNS; ++i) {
noalias(c) = c + (a + b) * 0.5f;
}
занимает 63 миллисекунды. Я не могу представить, почему для вас это займет 9400 миллисекунд, независимо от того, насколько медленна ваша машина. Я снова спрашиваю: вы уверены, что включили оптимизацию и делаете ссылки на библиотеки релизов?