Проблема с типом массива , который вы используете.
Вектор - это контейнер. Это структура, которая хранит несколько данных, таких как размер, начало, конец и т. Д .; и имеет несколько встроенных функций, где operator [] является одним из них, используемых для доступа к данным. В результате строки кэша, которые имеют тенденцию загружаться, скажем, для индекса "i" вектора V , загружают элемент V [i] и некоторую информацию, которая не используется в код.
Напротив, если вы используете классические массивы (динамические / статические), оператор [] приводит к загрузке только элементов данных. В результате строка кэша (обычно длиной 64 байта) будет загружать 8 элементов этого двойного массива (размер double = 8 байтов).
См. Различие между _mm_malloc и malloc для улучшения выравнивания данных.
@ Мистер Фуз
Я не уверен в этом. Давайте сравним результаты производительности для обоих случаев:
4 потока на процессоре i7
Array Time Taken: 0.122007 | Повторите: 4 | MFlops: 327,85
векторное время съемки: 0.101006 | Повторите: 2 | MFlops: 188,669
Я заставляю время выполнения быть более 0,1 сек, поэтому код повторяется. Основной цикл:
const int N = 10000000;
timing(&wcs);
for(; runtime < 0.1; repeat*=2)
{
for(int r = 0; r < repeat; r++)
{
#pragma omp parallel for
for(int i = 0; i < N; i++)
{
A[i] += B[i];
}
if(A[0]==0) dummy(A[0]);
}
timing(&wce);
runtime = wce-wcs;
}
MFLops: ((N * повтор) / время выполнения) / 1000000