Javier Luis Lopez Ответов: 1

Плавающие деления ужасно медленные на процессорах 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 попыталась распараллелить больше векторных операций за счет последовательного выполнения операций деления, как в первых исторических процессорах.

1 Ответов

Рейтинг:
6

Jochen Arndt

Цитата:
Вопрос: какие процессоры Intel E5 и имеет сопроцессор?
Да. Все процессоры на базе x86 имеют встроенный FPU x87 и векторные блоки (SSE, AVX).
Цитата:
Могу ли я использовать директиву компилятора, чтобы запустить его быстрее?
Да, но это зависит от компилятора и от того, можете ли вы принять уменьшенную обработку ошибок и не быть строгим IEEE-совместимым. Большинство компиляторов имеют какой-то быстрая математика варианты для этой цели. В зависимости от используемого процессора вы также можете включить использование скалярных инструкций (SSE) вместо FPU.
Цитата:
Он будет работать быстрее в процессоре I7?
Это зависит от тактовой частоты процессора x87 FPU / x86 (для SSE). Каждая инструкция требует определенного количества тактов.

Деления с плавающей запятой требуют гораздо больше тактов, чем сложения или умножения (в 8-20 раз по сравнению с умножениями). Это относится ко всем типам Плис, а не только к типам x86. Их следует избегать, когда требуется высокая производительность (например, путем умножения на обратное значение внутри циклов).

Из Справочное руководство по оптимизации архитектур Intel® 64 и IA-32
Цитата:
Правило Кодирования Ассемблера/Компилятора 4. (М воздействия, м общности) Пользу ГСП инструкции с плавающей точкой инструкции x87, так за плавающей точки.
Правило кодирования ассемблера/компилятора 5. (MH impact, M generality) Запускайте с маскированными исключениями и установленными флагами DAZ и FTZ (когда это возможно).
Предложение По Настройке 5. Использование счетчиков производительности MACHINE_CLEARS.FP_ASSIST, чтобы увидеть, влияют ли плавающие исключения на производительность программы


Javier Luis Lopez

Но в старых процессорах умножения, суммы и деления требовали одних и тех же тактовых циклов, пока "старые" Алу с плавающей запятой выполняли все за один цикл.
Воздействие сейчас таково:
Умножения: в 2 раза медленнее, чем суммы
Деления: в 100 раз медленнее!!
Похоже, что деления выполняются SW в качестве первых процессоров (для этого нужны были сопроцессоры)
Это делает процессоры с плавающей точкой на более низком уровне, чем raspberry pi 40$ micros
Некоторые инженерные программы могут выйти из строя.

Тогда есть ли какие-нибудь процессоры с делением с плавающей запятой, подобные производительности сумм?

Jochen Arndt

"Но в старых процессорах умножения, суммы и деления требовали одних и тех же тактовых циклов, пока "старые" Алу с плавающей запятой выполняли все за один цикл."

Пожалуйста, скажите мне, какой процессор.

Это всегда было одно и то же соотношение между add, mul и div (с некоторым отклонением) для плавающих точек. Там, где никогда (и, вероятно, никогда не будет) FPU, который требует одинакового количества циклов для add/mul и div.

Это относится и к пи (у него есть FPU, но он обеспечивает только основные операции и не имеет экспоненциальных и тригонометрических функций).
Пропускная способность и задержка для двойной точности с помощью рычага, используемого Pi 1:
FADD, FSUB: 1 + 8
FMUL, FMAC: 2 + 9
FDIV, FSQRT: 29 + 33

Использование программной реализации для div сделало бы его еще более медленным. Деления просто не так просты, как add и mul.

- Значит, существуют какие-нибудь процессоры с делениями с плавающей запятой, подобные суммам производительности?"

Я не знаю ни одного и думаю, что его нет и никогда не будет.

Javier Luis Lopez

К сожалению, я потерял данные 10-летней давности, поэтому мне приходится забыть о старых процессорах.
Проблема, возможно, в том, что в моем коде операции деления не могут быть конвейерными, пока нужно вычислить одно деление, а затем следующее.

Я протестировал также эту линию и имел 520MOPs:
for (int i=0;i< size/20;i++)
dsum=1.1/(dsum+2.2/(dsum+2.3/(dsum+2.4/(dsum+2.5/(dsum+2.6/(dsum+2.7/(dsum+2.8/(dsum+2.9/(dsum+2.1/(dsum+2.2/(dsum+2.3/(dsum+2.4/(dsum+2.5/(dsum+2.6/(dsum+2.7/(dsum+2.8/(dsum+2.9/(dsum+3.1/(dsum)))))))))))))))))));

Я читал также об архитектуре xeon и сказал, что производительность разделения очень низкая, как видно из этой рекомендуемой статьи: https://gmplib.org/~tege/x86-timing. pdf
А также здесь: https://stackoverflow.com/questions/4125033/floating-point-division-vs-floating-point-multiplication в ответе Питера Кордеса (но объясните только целое число).
Лучше всего оказалась архитектура AMD ZEN с двойной пропускной способностью.

Javier Luis Lopez

"Пожалуйста, скажите мне, какой процессор "
По крайней мере, я нашел результаты в старой резервной копии диска:
Pentium 2 4 Ггц: двойной prec: (d+d)/d+cte*d 49,6 Мопс
Pentium D 3 ГГц : 59,8 Мопс

Я думаю, что результат был очень быстрым, возможно, из-за того, что операции могли быть конвейеризованы.

Jochen Arndt

Мой вопрос относительно процессора касался одних и тех же тактовых циклов для mul и div и одного тактового цикла.

Все, что я могу предложить (например, Intel), - это использовать SSE вместо FPU.

Спасибо, что приняли мое решение, и извините за поздний ответ (мой DSL дома не работает с пятницы).

Javier Luis Lopez

Должно быть проще, если SSEs будут использовать те же самые присваивающие значения, операции и векторные типы, что и OpenCL