Хочу портировать библиотечку libSIMD

Вопросы использования сторонних (не входящих в состав FPC и Lazarus) утилит и библиотек.

Модератор: Модераторы

Хочу портировать библиотечку libSIMD

Сообщение Sniper » 28.05.2006 00:01:52

Вот нашёл в инете наиполезнейшую библиотеку http://libsimd.sourceforge.net/
Качать tarball пакет здесь http://sourceforge.net/projects/libsimd

Код: Выделить всё
typedef float vecs3[3];


void simd_vecs3_assign(float a, float b, float c, vecs3 v)
{


#ifdef USE_3DNOW

   /* set up the pointers : %eax = v, %edx = &a */
   /* move into MMX registers a,b and c*/
   /* assign to v */
   
   __asm__ __volatile__(

   "movd  %%eax,   %%mm0\n"
   "movd  %%esi,   %%mm1\n"
   "movd  %%ecx,   %%mm2\n"
   "pfacc %%mm1,   %%mm0\n"
   "movq  %%mm0,  (%%edx)\n"
   "movd  %%mm2, 8(%%edx)\n"
    :
    : "a" (a), "S" (b), "c" (c), "d" (v)
    : "memory");

#else

   /* in C : */
   v[0]=a;
   v[1]=b;
   v[2]=c;

#endif

}


Пытаюсь портировать в FPC. Неполучается из за недостаточной квалификации в асме. прошу помощи.

Код: Выделить всё
type ta=array[0..2]of single;
V1:ta;
procedure GetVector(X, Y, Z: single; var V: ta);
begin
  asm
     movd  mm0, [eax]
     movd  mm1, [esi]
     movd  mm2, [ecx]
     pfacc mm0, mm1
     movq  [edx], mm0
     movd  [edx+8], mm2
  end;
  {V[0] := X;
  V[1] := Y;
  V[2] := Z;}
end;

проверяю
GetVector(5,34,67,V1);
  Form1.caption := FloatToStr(v1[0])+ ' ' +FloatToStr(v1[1])+ ' ' +FloatToStr(v1[2]);     

Вылетает.
ставил в конец асм-вставки emms и femms из модуля mmx не помогает

p.s если кто хочет помоч в переводе то буду рад.
Sniper
постоялец
 
Сообщения: 472
Зарегистрирован: 28.05.2005 13:02:42

Сообщение STAKANOV » 28.05.2006 09:57:02

а на fpc по умолчанию по-моему как раз AT&T синтаксис :?
хотя если ошибку не выдало, то я ошибся (или где-то явно указано)

попробуй так:
Код: Выделить всё
procedure GetVector(X, Y, Z: single; var V: ta); assembler;
asm
     movd  mm0, [eax]
     movd  mm1, [esi]
     movd  mm2, [ecx]
     pfacc mm0, mm1
     movq  [edx], mm0
     movd  [edx+8], mm2
end;
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin » 28.05.2006 11:12:02

Дело не совсем в ассемблере... FPC передает параметры в функции совсем не так, как это делает GCC. Поддерживается ли способ вызова register - из документации я так и не понял. Тут нужно компилить с ключиком -a и смотреть, куда что он запихивает при вызове функции, и потом в самой ф-ции оттуда подбирать.

ps: А нужна ли такая либа на FPC при наличии {$MMX}, {$FPUTYPE SSE}, {$FPUTYPE SSE2} ? В GCC-то их нет... ;)
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sniper » 28.05.2006 13:23:04

STAKANOV
я поставил {$ASMMODE INTEL}, можно было бы оставить AT&T, но мне не привычно писать с точностью до наоборот %)

Sergei I. Gorelkin писал(а): ps: А нужна ли такая либа на FPC при наличии {$MMX}, {$FPUTYPE SSE}, {$FPUTYPE SSE2} ? В GCC-то их нет... ;)

В FPC нет {$FPUTYPE 3DNOW!}
Функция :
Код: Выделить всё
type ta=array[0..2]of single;
var
  V1:ta;
procedure le_GetVector(X, Y, Z: single; var V: ta);register;
begin
  V[0] := X;
  V[1] := Y;
  V[2] := Z;
end;

получаем
Код: Выделить всё
.globl   P$TES_FPC_ASM_LE_GETVECTOR$SINGLE$SINGLE$SINGLE$TA
P$TES_FPC_ASM_LE_GETVECTOR$SINGLE$SINGLE$SINGLE$TA:
# Temps allocated between ebp-8 and ebp+0
   pushl   %ebp
   movl   %esp,%ebp
   subl   $8,%esp
   movl   %esi,-8(%ebp)
   movl   %edi,-4(%ebp)
# Var X located at ebp+8
# Var Y located at ebp+12
# Var Z located at ebp+16
# Var V located in register
   movl   %eax,%edx
# [31] V[0] := X;
   movl   %edx,%edi
   leal   8(%ebp),%esi
   cld
   movl   $4,%ecx
   rep
   movsb
# [32] V[1] := Y;
   leal   4(%edx),%edi
   leal   12(%ebp),%esi
   cld
   movl   $4,%ecx
   rep
   movsb
# [33] V[2] := Z;
   leal   8(%edx),%edi
   leal   16(%ebp),%esi
   cld
   movl   $4,%ecx
   rep
   movsb
# [34] end;
   movl   -8(%ebp),%esi
   movl   -4(%ebp),%edi
   leave
   ret   $12

Вопросы есть? %)

У меня есть ещё вопрос:
Код: Выделить всё
# Var X located at ebp+8
# Var Y located at ebp+12
# Var Z located at ebp+16
# Var V located in register

В какой конкретно регистр был записал массив V? )
Sniper
постоялец
 
Сообщения: 472
Зарегистрирован: 28.05.2005 13:02:42

Сообщение Sergei I. Gorelkin » 28.05.2006 15:01:21

Массив - в eax, причем не сам массив, а адрес его первого элемента.

Вот чего никак не ожидал - так это того, что он будет single в single с помощью rep movsb пересылать... :shock: Интересно, _еще_ медленнее это можно сделать?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение pda » 28.05.2006 19:34:23

Sergei I. Gorelkin писал(а):ps: А нужна ли такая либа на FPC при наличии {$MMX}, {$FPUTYPE SSE}, {$FPUTYPE SSE2} ? В GCC-то их нет... ;)

Ещё бы кто объяснил что это даёт... Нешто само векторизирует? ;-) В gcc получается только сейчас начали делать, а в FPC уже сколько лет? Вау! 8)
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение Sniper » 28.05.2006 20:09:13

При использовании {$FPUTYPE SSE}, {$FPUTYPE SSE2} прироста производительности практически нет, так как получается код не конвеер-friendly
Вообщем кто разбирается и может помочь ДЕЛОМ хотя бы портировав две-три функции?

Вот чего обнаружил
Скачал base_w32_v21.zip (компилятор и rtl) сегодняшний
вот чего обнаружил. Код
Код: Выделить всё
procedure le_GetVector(X, Y, Z: single; var v :TVector3f);
begin
  V.x := X;
  V.y := Y;
  V.z := Z;
end;

БЕЗ {$FPUTYPE SSE}
компилится в то страшное что написано выше. С {$FPUTYPE SSE} вот в это
Код: Выделить всё
   pushl   %ebp
   movl   %esp,%ebp
   movss   8(%ebp),%xmm2
   movss   12(%ebp),%xmm0
   movss   16(%ebp),%xmm1
   movss   %xmm2,(%eax)
   movss   %xmm0,4(%eax)
   movss   %xmm1,8(%eax)
   leave
   ret   $12

Казалось бы также должно быть и в 2.0.2 ан нет, всё равно, хоть устанавливай {$FPUTYPE SSE} хоть не устанавливай опцию генерации SSE всёрано генерируется страшный код с rep movsb.

Вывод - компилятор от версии 2.0.2 шагнул далеко вперёд!
но это SSE, а в libSIMD присутствует 3DNOW! расширение
Sniper
постоялец
 
Сообщения: 472
Зарегистрирован: 28.05.2005 13:02:42

Сообщение SAK » 28.05.2006 22:54:54

А почему нельзя явно указать?

Код: Выделить всё
procedure GetVector(X, Y, Z: single; var V: ta); assembler;
  asm
     movd  mm0, x
     movd  mm1, y
     movd  mm2, z
     pfacc mm0, mm1
     movq  [v], mm0
     movd  [v+8], mm2
  end;

В Delphi это работает, но только если выполнена хотя бы одна из перечисленных команд FloatToStr перестаёт работать вообще.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Сообщение Sniper » 28.05.2006 23:40:56

За идею тебе пятёрка, я знал но чего=-то про это забыл-напомнил.
У меня работает с FloatToStr и в Delphi и FPC, тока надо добавить emms %)
Продолжу портирование - кто захочет помоч - дайте знать.

Полчаса спустя: класс 3DNOW! в 3-4 раза быстрее- кто бы сомневался. )))
Sniper
постоялец
 
Сообщения: 472
Зарегистрирован: 28.05.2005 13:02:42

Сообщение Mirage » 19.10.2007 17:56:08

Порт был успешен? :)
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Сообщение trifon » 19.10.2007 19:03:20

Sergei I. Gorelkin писал(а):ps: А нужна ли такая либа на FPC при наличии {$MMX}, {$FPUTYPE SSE}, {$FPUTYPE SSE2} ? В GCC-то их нет... ;)

Прошу прощения, но прежде чем писать такое, может стоило почитать документацию по gcc.
-mfpmath=sse - использование для FPU sse или sse2 (зависит от архитектуры) вместо 387, для x86-64 используется по умолчанию.
-mfpmath=387 - используется для i387 - i687
-mfpmath=sse,387 - и то и другое, на усмотрение компилятора

и все равно большой пользы от sse без ассемблера не будет Оптимизация под SSE
trifon
постоялец
 
Сообщения: 135
Зарегистрирован: 24.12.2006 12:08:35

Сообщение Bonart » 24.10.2007 08:50:49

trifon писал(а):и все равно большой пользы от sse без ассемблера не будет

В Intel C Compiler - будет.
Ну хреновый у FPC (пока) оптимизатор.
Bonart
новенький
 
Сообщения: 81
Зарегистрирован: 29.06.2007 11:47:40


Вернуться в Сторонние средства

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru