Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »
Страницы: 1 2

Инструкция ANDN (asm64)


dmk ©   (20.02.17 14:07[20]

VEX.NDS1.LZ.0F38.W0 F7 /r
NOTES:
1. ModRM:r/m is used to encode the first source operand (second operand) and VEX.vvvv encodes the second source operand (third operand).

RMV V/V BMI1 Contiguous bitwise extract from r/m32 using r32b as control;
store BEXTR r32a, r/m32, r32b result in r32a.

Не очень ясно что такое NDS1 и LZ.
W0 и W1 определяет битность 32 или 64.

Получается $66, $0F, $38, $F7 и дальше куда регистры впихнуть непонятно ;) ПОСЛЕ или В имеющийся байт-код.


Rouse_ ©   (22.02.17 17:39[21]

Если я правильно помню опкоды, (дельфи под руками нет) то влетишь на ILLEGAL_INSTRUCTION


Rouse_ ©   (22.02.17 17:53[22]

да, забыл, возьми какойнить дизасм движок (я пользуюсь дистормом под 64 бита https://github.com/gdabah/distorm) и поэксперементируй, в конец DB нопов накидай


Rouse_ ©   (22.02.17 17:55[23]

ЗЫ не забудь, что у тебя 64 бита - значит REX префикс правильно выставь


invis ©   (22.02.17 19:58[24]

Есть ещё PANDN, которая для SIMD, её Дельфи понимает.


Sha ©   (27.02.17 01:32[25]

procedure TForm1.Button1Click(Sender: TObject);
var
 a: cardinal;
 b: Int64Rec;
begin;
 a:=$af;
 b.Lo:=a and $0f * $00204081 and $01010101 * 255;
 b.Hi:=a shr   4 * $00204081 and $01010101 * 255;
 ShowMessage(IntToHex(Int64(b),16));
 end;


Sha ©   (27.02.17 10:19[26]

Можно и в одну строчку, только очень длинную )

procedure TForm1.Button1Click(Sender: TObject);
var
 a: int64;
begin;
 a:=$af;
 a:=(a * $0101010101010101 and $8040201008040201 xor $8141211109050301 - $8040201008040201) shr 7 and $0101010101010101 * 255;
 ShowMessage(IntToHex(a,16));
 end;


Sha ©   (27.02.17 10:28[27]

если нужен NOT, то надо заменить

xor $8141211109050301

на

or $0101010101010100


Sha ©   (27.02.17 13:53[28]

более короткий вариант:

procedure TForm1.Button1Click(Sender: TObject);
var
 a: int64;
begin;
 a:=$af;
 a:=(a shr 1 * $0204081020408100 or a) and $0101010101010101 * 255;
 ShowMessage(IntToHex(a,16));
 end;


NoUser ©   (27.02.17 16:07[29]

dmk,
var QwTab : array [0..255] of Int64;

procedure InitTab();
var
pQ:PInt64;
A :Byte;
begin
A := 0;
pQ := @QwTab;
repeat
 pQ^ := (A shr 1 * $0204081020408100 or A) and $0101010101010101 * 255;
 Inc(pQ);
 Inc(A);
until (A = 0);
end;

procedure Bt2Qws(pB:PByte; pQ:PInt64; bN:NativeInt); inline;
var
pT:PInt64Array;
begin
pT := @QwTab;
while (bN > 0) do begin
 pQ^ := pT^[pB^];
 Inc(pQ);
 Inc(pB);
 Dec(bN);
end;
end;

function Test(a:Byte):Int64;
var
b : array[0..7] of Byte;
q : array[0..7] of Int64;
begin
InitTab();

DebugBreak();                 // Relese -> F9 -> F7
Bt2Qws(@b, @q, SizeOf(b));    // -> very nice asm !

Result := QwTab[a];
end;


NoUser ©   (27.02.17 16:22[30]


> У меня сейчас таблица зарнее расчитана 8 -> 64,
> но очень медленно получается из памяти читать.

ну, читай из облака или алгоритм меняй ))

проблема может быть в том, что твои 20 ядер (на самом деле 10 плюс HT, который тут не нужен) 'уродуют' кэш или у тебя с выравниванием проблемы.


dmk ©   (27.02.17 16:49[31]

>алгоритм меняй
Дык не работает BIM1,2 в дельфи.


NoUser ©   (27.02.17 17:44[32]

я от том, что замена одного чтения (из 2 чтений и 1 записи) на одну лог операцию ( чтение bim запись) тебя сильно не спасёт.

тестер уже есть - замени bim, например, на xor - посмотри прирост в сравнении с таблицой (для одного потока, для многих )


Sha ©   (27.02.17 21:11[33]

Немного ускорил преобразование:

procedure TForm1.Button1Click(Sender: TObject);
var
 a: int64;
begin;
 a:=$af;
 a:=(a and 254 * $0002040810204080 or a) and $0101010101010101 * 255;
 ShowMessage(IntToHex(a,16));
 end;


Читать лучше блоками по 8 байт, в этом случае код несколько изменится:
var
 a: array[0..99] of int64;
 b: array[0..Length(a)*8-1] of int64;

procedure TForm1.Button6Click(Sender: TObject);
var
 i: integer;
 x: int64;
 p: pInt64;
begin;
 p:=@b[0];
 for i:=0 to Length(a)-1 do begin;
   x:=a[i];    p^:=(x and 254 * $0002040810204080 and $0101010101010101 or x and 1) * 255; inc(p);
   x:=x shr 8; p^:=(x and 254 * $0002040810204080 and $0101010101010101 or x and 1) * 255; inc(p);
   x:=x shr 8; p^:=(x and 254 * $0002040810204080 and $0101010101010101 or x and 1) * 255; inc(p);
   x:=x shr 8; p^:=(x and 254 * $0002040810204080 and $0101010101010101 or x and 1) * 255; inc(p);
   x:=x shr 8; p^:=(x and 254 * $0002040810204080 and $0101010101010101 or x and 1) * 255; inc(p);
   x:=x shr 8; p^:=(x and 254 * $0002040810204080 and $0101010101010101 or x and 1) * 255; inc(p);
   x:=x shr 8; p^:=(x and 254 * $0002040810204080 and $0101010101010101 or x and 1) * 255; inc(p);
   x:=x shr 8; p^:=(x and 254 * $0002040810204080 and $0101010101010101 or x and 1) * 255; inc(p);
   end;
 end;


Можно попробовать повертеть биты, вдруг это окажется быстрее:
procedure TForm1.Button7Click(Sender: TObject);
var
 i: integer;
 t, x: int64;
 p: pInt64;
begin;
 p:=@b[0];
 for i:=0 to Length(a)-1 do begin;
   x:=a[i];

   //bit twiddling: flip chessboard diagonal
   t:=(x shl 28 xor x) and $0f0f0f0f00000000; x:=(x xor t) xor t shr 28;
   t:=(x shl 14 xor x) and $3333000033330000; x:=(x xor t) xor t shr 14;
   t:=(x shl 07 xor x) and $5500550055005500; x:=(x xor t) xor t shr 07;

   p^:=x       and $0101010101010101 * 255; inc(p);
   p^:=x shr 1 and $0101010101010101 * 255; inc(p);
   p^:=x shr 2 and $0101010101010101 * 255; inc(p);
   p^:=x shr 3 and $0101010101010101 * 255; inc(p);
   p^:=x shr 4 and $0101010101010101 * 255; inc(p);
   p^:=x shr 5 and $0101010101010101 * 255; inc(p);
   p^:=x shr 6 and $0101010101010101 * 255; inc(p);
   p^:=x shr 7 and $0101010101010101 * 255; inc(p);
   end;
 end;


dmk ©   (27.02.17 21:55[34]

>NoUser ©   (27.02.17 16:07) [29]
Вообще на Delphi моя процедура выглядит так:

procedure TImageStream.BitsToBytesA(Src, Dest, NumBits: uint64);
var
 b: byte;
 NumPixels: uint64;

const
 crWhite: uint64 = $FFFFFFFFFFFFFFFF;

type
 PQWord = ^uint64;

begin
NumPixels := (NumBits shr 3);
repeat
  b := PByte(src)^ and FIndexedMask;
  if b = 0 then
    PQWord(Dest)^ := crWhite else
    PQWord(Dest)^ := PQWord(GrayBitsAddr + (b shl 3))^;
  Inc(Src);
  Inc(Dest, 8);
  Dec(NumPixels);
until (NumPixels = 0);
end;


Инициализация таблицы не критична.
Там микросекунды и это при загрузке происходит.
А ваша вообще не работает :)


dmk ©   (27.02.17 21:59[35]

Но версия на Delphi в 2 раза медленнее чем версия на ASM из [11].
Исходный объем: 676.24 Мб
ASM - 2.69 секунды
Pascal - 4.98 секунды


Sha ©   (27.02.17 22:16[36]

> dmk ©   (27.02.17 21:59) [35]
> Но версия на Delphi в 2 раза медленнее чем версия на ASM из [11].

Мне показалось, что была проблема с алгоритмом.
И мне было интересно потратить немного времени на сам алгоритм.

Но ты же понимаешь разницу между алгоритмом и реализацией?
Я совсем не хочу тратить свое свободное время и переписывать его ASM.


dmk ©   (27.02.17 22:56[37]

Да я для NoUser написал :)


NoUser ©   (28.02.17 00:03[38]

> А ваша вообще не работает :)
Я и не претендую.

А вот твоя (и асм и делфи), в некоторые моменты, действительно 'не работает' ! ;))


dmk ©   (28.02.17 05:08[39]

У меня все работает. Вы ее применять не умеете ;)


Страницы: 1 2 версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо