Почему предварительная выборка программного обеспечения (_mm_prefetch), которую я использую, недопустима в C? - PullRequest
1 голос
/ 21 сентября 2019

Я написал программу, которая тестирует _mm_prefetch (с gcc -O3): есть два случайных массива,

  1. , один из которых проходит 1/600 длины первого случайного массива (аппаратная предварительная выборка, попадание в кэш)
  2. другой обходит весь второй случайный массив на 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
...