Производительность: сделать все сразу или зациклить несколько раз для каждой операции? - PullRequest
0 голосов
/ 27 сентября 2019

Является ли обычно быстрее (и почему) для одновременного выполнения всех инструкций во время итерации?Это кажется необходимым по причинам кэша.Или мы можем повторить несколько раз?

Стоит отметить, что count велико (от 1000 до 1 000 000).

//original loop, wish to separate into several loops:
for(size_t i=0; i<10000000; ++i){
    floatVec_A[i] +=  floatVec_B[i] - floatVec_C[i]*floatVec_D[i];
    floatVec_A[i] = std::sin(floatVec_A[i]);
    //and so on
}

против того, что я хочу (но боюсь, это может быть медленный подход ... обычно ?):

for(size_t i=0; i<10000000; ++i){
    floatVec_A[i] +=  floatVec_B[i];
}
for(size_t i=0; i<10000000; ++i){
    floatVec_A[i] += -floatVec_C[i]*floatvec_D[i];
}
for(size_t i=0; i<10000000; ++i){
    floatVec_A[i] = sin(floatVec_A[i]);
}
//and so on

Я желаю этого, потому что эти отдельные циклы могут быть заменены аккуратными функциями, что делает код более читабельным.Для меня это сделало бы жизнь намного проще, поскольку внутренне я фактически использую встроенные функции AVX, и приведенный выше код упрощен, например, для примера.

myMath::add_toFirst( floatVec_A,  floatVec_B); 
myMath::mul_toThird( floatVec_C,  floatVec_D,  resultVec);
myMath::add_toFirst( floatVec_A,  resultVec);
myMath::sin(floatVec_A);
//and so on

В целом выполняет исполнениестрадать в последнем случае, мало или много, и из-за каких факторов?

1 Ответ

1 голос
/ 27 сентября 2019

Ваш первый пример ...

//original loop, wish to separate into several loops:
for(size_t i=0; i<10000000; ++i){
    floatVec_A[i] +=  floatVec_B[i] - floatVec_C[i]*floatVec_D[i];
    floatVec_A[i] = std::sin(floatVec_A[i]);
    //and so on
}

будет работать лучше всего из-за кэша процессора.

Выборка данных обычно доминирует над производительностью, а первый пример является наиболее дружественным к кэшу (линейный и предсказуемый).).По этой причине компилятор может фактически объединить ваши циклы в один цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...