Я написал программу, которая тестирует _mm_prefetch
(с gcc -O3): есть два случайных массива,
- , один из которых проходит 1/600 длины первого случайного массива (аппаратная предварительная выборка, попадание в кэш)
- другой обходит весь второй случайный массив на 600 шагов (аппаратная предварительная выборка, пропадание кэша)
Я использовал предварительную выборку _mm_prefetch во втором тесте, нопроизводительность все еще не улучшилась. Почему это? что мне делать?подскажите пожалуйста
Код в C:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <xmmintrin.h>
#define LENGTH 10000000
#define Max 10000000
//Generate a random array
int * random_arr(int lo,int hi,int num){
int *arr = malloc(sizeof *arr *num);
srand((unsigned)time(NULL));
for (int i=0; i<num; i++) {
arr[i]=rand()%(hi-lo)+lo;
}
return arr;
}
int main(int argc, const char * argv[]) {
int * random_array1 = random_arr(0, Max, LENGTH); // the first random array
int * random_array2 = random_arr(0, Max, LENGTH); // the second random array
clock_t start1 = clock();
//-------------------------------------------------------------- first test
for (int i = 0; i<LENGTH/600; ++i) {
random_array1[i] = i;
}
//--------------------------------------------------------------
clock_t end1 = clock();
double duration1 = ((double)(end1 - start1)) / CLOCKS_PER_SEC;
printf("The first test running time: %lf s\n", duration1);
//=========================================
clock_t start2 = clock();
//-------------------------------------------------------------- second test
for (int i = 0; i < LENGTH; i+=600) {
_mm_prefetch(&random_array2[i+600], _MM_HINT_T0);
_mm_prefetch(&random_array2[i+1200], _MM_HINT_T0);
random_array2[i] = i;
}
//--------------------------------------------------------------
clock_t end2 = clock();
double duration2 = ((double)(end2 - start2)) / CLOCKS_PER_SEC;
printf("The second test running time: %lf s\n", duration2);
return 0;
}
Результат выполнения кода:
The first test running time: 0.000076 s
The second test running time: 0.001859 s