Я хочу научиться программированию SIMD. Теперь у меня есть интересный момент в моем коде.
Я просто хочу измерить время работы моего кода. Я пытаюсь применить некоторые базовые функции для моего массива с определенным размером.
Сначала я пытаюсь использовать функцию, которая была написана с инструкциями SIMD, и после этого я пытаюсь использовать обычный подход. И я сравниваю время этих двух реализаций одной и той же функции.
Я определил производительность как (время без sse) / (время с использованием sse).
Но когда у меня размер 8, у меня производительность составляет 1,3, а когда мой размер = 512 - у меня производительность = 3, если у меня размер = 1000, производительность = 4, если размер = 4000 -> производительность = 5.
Я не понимаю, почему моя производительность увеличивается при увеличении размера массива.
Мой код
void init(double* v, size_t size) {
for (int i = 0; i < size; ++i) {
v[i] = i / 10.0;
}
}
void sub_func_sse(double* v, int start_idx) {
__m256d vector = _mm256_loadu_pd(v + start_idx);
__m256d base = _mm256_set_pd(2.0, 2.0, 2.0, 2.0);
for (int i = 0; i < 128; ++i) {
vector = _mm256_mul_pd(vector, base);
}
_mm256_storeu_pd(v + start_idx, vector);
}
void sub_func(double& item) {
for (int k = 0; k < 128; ++k) {
item *= 2.0;
}
}
int main() {
const size_t size = 8;
double* v = new double[size];
init(v, size);
const int num_repeat = 2000;//I should repeat my measuraments
//because I want to get average time - it is more clear information
double total_time_sse = 0;
for (int p = 0; p < num_repeat; ++p) {
init(v, size);
TimerHc t;
t.restart();
for (int i = 0; i < size; i += 8) {
sub_func_sse(v, i);
}
total_time_sse += t.toc();
}
double total_time = 0;
for (int p = 0; p < num_repeat; ++p) {
init(v, size);
TimerHc t;
t.restart();
for (int i = 0; i < size; ++i) {
sub_func(v[i]);
}
total_time += t.toc();
}
std::cout << "time using sse = " << total_time_sse / num_repeat << std::endl <<
"time without sse = " << total_time / num_repeat << std::endl;
system("pause");
}