LINUX.ORG.RU

Что в мире софта linux использует FPU, AVX и прочие подобные инструкции?

 ,


1

1

В треде Тесты Intel Linpack подняли интересный вопрос производительности как раз именно FPU и его продолжений/вариантов. А как вообще возможно понять надо ли это софтине? Вот, например, ставлю я nginx. Надо ему вычисления с плаващей точкой или нет? А если это nginx в виртуалке в qemu-kvm? В этой цепи используются такие вычисления? Может быть есть ресурс, где софт классифицирован по этому признаку?
Спасибо.
ЗЫ. Я хз какой тэг ставить.
ЗЗЫ. Я почему спрашиваю... Когда-то, довольно давно, я неплохо представлял себе работу ЦП КР580ВМ80А, который аналог i8080A. Баловался на асме, в том числе. Там всё было просто. АЛУ, который делал и математику и логику. А в современном мире мало того, что ЦП стали гораздо сложнее, так и софт очень сильно абстрагировался от железа. И мне стало совершенно немозможно понимать, что из возможностей ЦП используется софтом, как это происходит и как определить потребность в таком использовании. В области практического применения, вопрос затрагивает производительность конечного софта. В смысле, вот есть есть сейчас АМД с медленными модулями (FPU/AVX) и есть Интел с быстрыми модулями. А вот той же виртуализации qemu/kvm вообще есть дело до FPU/AVX? Оно ей не пофиг ли?

ЗЗЗЫ. Научные расчёты, обработка звука/видео, хэши/шифрование, геометрия в играх от первого и не только лица.

★★★★★

Последнее исправление: targitaj (всего исправлений: 6)
Ответ на: комментарий от targitaj

Очевидно, для ускорения сборок. (=

Различные криптоалгоритмы часто юзают AVX, при сборке ядра можно увидеть. Еще софт типа ffmpeg вроде бы (тут могу ошибаться).

DeadEye ★★★★★
()
Ответ на: комментарий от targitaj

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

DeadEye ★★★★★
()
Ответ на: комментарий от DeadEye

если GCC собирает с оными инструкциями

может быть, ты имел ввиду, с «поддержкой оных инструкций»? Чтобы конечный софт мог их использовать?

targitaj ★★★★★
() автор топика
Ответ на: комментарий от targitaj

Я хз какой тэг ставить.

«я познаю мир»

А как вообще возможно понять надо ли это софтине?

если она написана с использованием соотв. asm-вставок - значит прям надо (ffmpeg, mplayer, *libc, эмули приставок, ... )

Компилятор? Зачем?

для ленивых, можно заказать соотв. оптимизации, жеж (https://twiki.cern.ch/twiki/bin/view/LHCb/VectorizeSource-code)
и в меру своих возможностей он тебе «сделает №;ись», раз уж не осилил сам в своей софтине подкрутить узкие места
либо ты гентушник, и хочешь «сделает №;ись» всей системе
как-то так

anTaRes ★★★★
()
Ответ на: комментарий от anTaRes

можно заказать соотв. оптимизации

оптимизации чего? Какие вычисления в qemu-kvm требуют задействования таких вещей?

targitaj ★★★★★
() автор топика
Ответ на: комментарий от DeadEye

Погоди, так в том и вопрос, а надо ли оно вообще конкретной проге. Тому же nginx это надо? Что этот сервис вычисляет?

targitaj ★★★★★
() автор топика
Ответ на: комментарий от targitaj

Да блин, не все проги их используют. Ты просил выше примеры использования - я пару привел, которые знал, про остальное я не в курсах.

DeadEye ★★★★★
()

# equery h cpu_flags_x86_avx
* Searching for USE flag cpu_flags_x86_avx ...
[IP-] [ ] media-video/ffmpeg-2.8.4:0/54.56.56

А fpu, если не ошибаюсь, глобально в CFLAGS указывается.

afterlanding ★★
()
Ответ на: комментарий от anonymous

openssl

точно. Хэши, шифрование и прочее по теме.

targitaj ★★★★★
() автор топика

Когда GCC компилирует код для архитектуры, поддерживающей AVX, он все операции с плавающей точкой делает через AVX.

Если ты возьмёшь такую элементарную программу:

#include <stdio.h>

int main(int argc, char* argv[]) {
	float f1, f2;
	if(argc != 3) {
		fputs("Bad arguments\n", stderr);
	}
	sscanf(argv[1], "%f", &f1);
	sscanf(argv[2], "%f", &f2);
	printf("%f\n", f1 / f2);
}
И скомпилируешь её, например, так:
$ gcc --version
gcc (Debian 5.3.1-5) 5.3.1 20160101
(...)

$ gcc -O0 -march=sandybridge -o float-test float-test.c
А потом сделаешь objdump:
$ objdump -d float-test
(...)

00000000004005e6 <main>:
  4005e6:	55                   	push   %rbp
  4005e7:	48 89 e5             	mov    %rsp,%rbp
  4005ea:	48 83 ec 20          	sub    $0x20,%rsp
  4005ee:	89 7d ec             	mov    %edi,-0x14(%rbp)
  4005f1:	48 89 75 e0          	mov    %rsi,-0x20(%rbp)
  4005f5:	83 7d ec 03          	cmpl   $0x3,-0x14(%rbp)
  4005f9:	74 1e                	je     400619 <main+0x33>
  4005fb:	48 8b 05 9e 04 20 00 	mov    0x20049e(%rip),%rax        # 600aa0 <stderr@@GLIBC_2.2.5>
  400602:	48 89 c1             	mov    %rax,%rcx
  400605:	ba 0e 00 00 00       	mov    $0xe,%edx
  40060a:	be 01 00 00 00       	mov    $0x1,%esi
  40060f:	bf 14 07 40 00       	mov    $0x400714,%edi
  400614:	e8 b7 fe ff ff       	callq  4004d0 <fwrite@plt>
  400619:	48 8b 45 e0          	mov    -0x20(%rbp),%rax
  40061d:	48 83 c0 08          	add    $0x8,%rax
  400621:	48 8b 00             	mov    (%rax),%rax
  400624:	48 8d 55 fc          	lea    -0x4(%rbp),%rdx
  400628:	be 23 07 40 00       	mov    $0x400723,%esi
  40062d:	48 89 c7             	mov    %rax,%rdi
  400630:	b8 00 00 00 00       	mov    $0x0,%eax
  400635:	e8 86 fe ff ff       	callq  4004c0 <__isoc99_sscanf@plt>
  40063a:	48 8b 45 e0          	mov    -0x20(%rbp),%rax
  40063e:	48 83 c0 10          	add    $0x10,%rax
  400642:	48 8b 00             	mov    (%rax),%rax
  400645:	48 8d 55 f8          	lea    -0x8(%rbp),%rdx
  400649:	be 23 07 40 00       	mov    $0x400723,%esi
  40064e:	48 89 c7             	mov    %rax,%rdi
  400651:	b8 00 00 00 00       	mov    $0x0,%eax
  400656:	e8 65 fe ff ff       	callq  4004c0 <__isoc99_sscanf@plt>
  40065b:	c5 fa 10 45 fc       	vmovss -0x4(%rbp),%xmm0
  400660:	c5 fa 10 4d f8       	vmovss -0x8(%rbp),%xmm1
  400665:	c5 fa 5e c1          	vdivss %xmm1,%xmm0,%xmm0
  400669:	c5 ea 5a d0          	vcvtss2sd %xmm0,%xmm2,%xmm2
  40066d:	c4 e1 f9 7e d0       	vmovq  %xmm2,%rax
  400672:	c4 e1 f9 6e c0       	vmovq  %rax,%xmm0
  400677:	bf 26 07 40 00       	mov    $0x400726,%edi
  40067c:	b8 01 00 00 00       	mov    $0x1,%eax
  400681:	e8 1a fe ff ff       	callq  4004a0 <printf@plt>
  400686:	b8 00 00 00 00       	mov    $0x0,%eax
  40068b:	c9                   	leaveq 
  40068c:	c3                   	retq   
  40068d:	0f 1f 00             	nopl   (%rax)

(...)

то, как видишь, GCC использует инструкции AVX для деления float'ов (vmovss, vdivss, vcvtss2sd).

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

Окей, nginx делает

деления float'ов

?
Вопрос не в абстрактной возможности задействовать. Вопрос где реально нужно и уже задействовано.

targitaj ★★★★★
() автор топика
Последнее исправление: targitaj (всего исправлений: 1)
Ответ на: комментарий от targitaj

Вопрос не в абстрактной возможности задействовать. Вопрос где реально нужно и уже задействовано.

То есть ты спрашиваешь, в каком софте используется арифметика с плавающей точкой?

(в nginx она используется в нескольких местах, например, в ngx_http_image_filter_module)

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

Хм. А есть возможность более детально посмотреть? Для не программистов. Например, постгрес юзает ли? И как активно, если юзает.

targitaj ★★★★★
() автор топика
Ответ на: комментарий от targitaj

Для не программистов.

Когда-то, довольно давно, я неплохо представлял себе работу ЦП КР580ВМ80А, который аналог i8080A. Баловался на асме, в том числе.

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

Это было давно. Я не программист.

targitaj ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.