У меня нет большого опыта работы с openmp.OpenMP для цикла и указателя
Возможно ли сделать следующий код быстрее, используя указатель for for вместо указателя?
Есть ли способ сделать следующий код быстрее?
Код умножает массив на константу.
спасибо.
Код:
#include <iostream>
#include <stdlib.h>
#include <stdint.h>
#include <vector>
using namespace std;
int main(void){
size_t dim0, dim1;
dim0 = 100;
dim1 = 200;
std::vector<float> vec;
vec.resize(dim0*dim1);
float scalar = 0.9;
size_t size_sq = dim0*dim1;
#pragma omp parallel
{
#pragma omp for
for(size_t i = 0; i < size_sq; ++i){
vec[i] *= scalar;
}
}
}
Последовательный указатель петли
float* ptr_start = vec.data();
float* ptr_end = ptr_start + dim0*dim1;
float* ptr_now;
for(ptr_now = ptr_start; ptr_now != ptr_end; ++ptr_now){
*(ptr_now) *= scalar;
}
В вашем цикле имеется всего 20 000 значений, а также для синхронизации процессора. Вы оценили, насколько быстро цикл работает с OMP и без него? Можете ли вы поделиться этими результатами? –
фактический массив намного больше, чем этот. Я также хочу знать, сделал ли я что-то, что ухудшает производительность, потому что я буду использовать openmp в других местах. – rxu
Действительно сгенерированный код может отличаться от того, что вы написали. Вы разобрали программу выпуска со всеми оптимизациями? P.S .: Ваш OpenMP позволяет использовать 'size_t' в качестве типа индекса? – ilotXXI