Плавающие деления ужасно медленные на процессорах Intel I5 & E5 xeon
Я провел тест производительности на своем компьютере (win10)с процессором Intel xeon CPU E5-1620 v3 @3.5 Ghz, получив результаты simitar, чем производительность raspberry pi. Мой медведь рос в ожидании.
Я получил:
целочисленные суммы: 2184 Мопс (мегаоперации в секунду), как и ожидалось
двойные деления: 15,6 - 18,32 Мопс
двойное умножение: 344 -430 Мопс
двойные суммы: 881-1178 швабр
поплавковые деления: 17,3-19,1 Мопс
Обновлено: я тестировал на I5 и подразделениях, где медленнее, чем 21 швабра
Вопрос: какие процессоры Intel E5 и имеет сопроцессор?
Могу ли я использовать директиву компилятора, чтобы запустить его быстрее?
Он будет работать быстрее в процессоре I7?
Что я уже пробовал:
Это мой код. Пожалуйста, запустите его на любом компьютере, так как он работает очень хорошо!:
#include <iostream> #include <time.h> //clock(), time_t #pragma warning(disable:4996) //disable deprecateds using namespace std; time_t start,stop;char null_char='\0'; //Use empty timer() to reset start time: void timer(char *title=&null_char,int data_size=1){ stop=clock(); if (*title) cout<<title<< " time ="<<(double) (stop-start)/(double) CLOCKS_PER_SEC<< " = " << 1e-6*data_size/( (double)(stop-start)/(double)CLOCKS_PER_SEC ) << " Mops/seg" <<endl; start=clock(); } int main() { cout << "Perform test in Release mode. Results will be wrong in debug mode" <<endl; int isum=0,size=100*1024*1024; timer();//void timer resets timer! for (int i=0;i<size;i++) isum+=i; timer("Time for 100 Mega int sums ",size); double dsum=1.0; for (int i=0;i<size;i++) dsum=dsum/1.1111; timer("Time for 100 Mega double divisions",size);double d2=1.111;dsum+=0.1; for (int i=0;i<size;i++) dsum/=d2; timer("Time for 100 Mega double divisions-2",size); for (int i=0;i<size;i++) dsum=dsum*d2; timer("Time for 100 Mega double multiplications",size); for (int i=0;i<size;i++) dsum=dsum+d2; timer("Time for 100 Mega sums multiplications",size); float fsum=1.0f; for (int i=0;i<size;i++) fsum=fsum/1.1111f; timer("Time for 100 Mega float divisions",size); cout<<endl<<" Reject following line data (done to force for loops be performed after compiler optimizations):"<<endl;; cout<<isum<<dsum<<fsum<<endl;//to force for() be done on isum cout<<"=== FIN ==="<<endl;getchar(); return 1; }
Richard MacCutchan
Вы смотрели документацию Intel для этого процессора?
Kornfeld Eliyahu Peter
Этот процессор не имеет расширения F16C, и это может объяснить медленные вычисления с плавающей запятой...
Он есть у 4-го поколения i7, но есть и у E5-1650, так что, вероятно, оба они превзойдут E5-1620...
Если вы ищете процессор для использования в интенсивной настройке вычислений, вы должны провести серьезное исследование (и не только на столе Intel)...
Javier Luis Lopez
Я не являюсь специалистом по архитектуре Intel, только делал тесты. На E5 v3 имеет
3 целочисленных ALU и 2 векторных Alu (для использования в AVX). Кроме того, он имеет микроархитектуру sandy bridge с планировщиками, которые можно использовать для распараллеливания векторных операций, как это можно увидеть здесь:
https://www.realworldtech.com/includes/images/articles/sandy-bridge-5.png
Полную схему можно увидеть здесь: https://www.realworldtech.com/includes/images/articles/sandy-bridge-7.png?x51911). Так что я думаю (может быть, ошибаюсь) Intel попыталась распараллелить больше векторных операций за счет последовательного выполнения операций деления, как в первых исторических процессорах.