Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.58/55: Рейтинг темы: голосов - 55, средняя оценка - 4.58
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263

Побитовые операции с памятью

16.03.2020, 18:01. Показов 12623. Ответов 150
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть ли в Delphi какие-нибудь функции чтобы побитово сделать and or xor not с двумя произвольными кусками памяти? Можно чтобы это были обязательно два равных по длине куска, неважно.
Например для сравнения двух кусков есть очень быстрая функция CompareMem.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.03.2020, 18:01
Ответы с готовыми решениями:

Побитовые операции
Задание: Дано целое неотрицательное число. Определить количество составляющих его шестнадцатеричных цифр, содержащих в двоичном...

Побитовые операции
С помощью побитовых операций преобразовать число -78 в 15 Вот что пыталась делать, кто знает как сделать? int v =-78; int i = 1; ...

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

150
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
01.04.2020, 19:30
Студворк — интернет-сервис помощи студентам
Native SSE2Native AVX512x128 origx128 modx128 asm x128 AVX2
smp1,42-6,181,640,972,41
smp_alpha39,44-6,191,610,972,23
С реализацией на AVX2 явно что-то не так. Если че у меня i5-6600.

И еще. Я бы убрал из замера подготовку семпла, это обычно делается один раз, а поиск может быть выполнен многократно.
0
 Аватар для snake32
3590 / 1720 / 236
Регистрация: 26.02.2009
Сообщений: 8,713
Записей в блоге: 5
01.04.2020, 19:38
Native SSE2 самый тормоз оказался - 31,4 мс
AVX512 - серый
x128 orig - 5
x128 mod - 1.15
x128 asm - 0.453 <- старый добры asm x86 рулит
x128 AVX2 - 3.93

Проц Ryzen 9 3950X. Тест с альфой
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
01.04.2020, 20:06
Naive SSE2 даёт неплохой результат на сэмпле без прозрачных пикселей вначале.

По AVX2 не уверен, т.к. в сети много упоминаний о том, что vgatherdps - это жуткий тормоз и не даёт профита вообще. Ну ещё на производительность может повлиять тот факт, что мне пришлось разбить массив smp на 2 массива: один для индексов, другой для цветов (наверное теперь процессор не может нормально закэшировать эти массивы). Как видим на процессорах AMD AVX2 работает ещё хуже. Если эта тема интересна могу сделать простой тест для сравнения выборки через vgather и через обычный mov.

Добавлено через 5 минут
Да я назвал функции Naive SSE2 и Naive AVX512 от слова наивный, т.к. там нет никаких хитрых алгоритмических оптимизаций - просто тупое сравнение по маске.
0
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
01.04.2020, 20:37  [ТС]
Тесты с прозрачным семплом.

Native SSE2 57,48
x128 Orig 5,92
x128 mod 1,91
x128 asm 0,73

Процессор i5 3570k
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
01.04.2020, 20:58
Цитата Сообщение от murderer Посмотреть сообщение
Да я назвал функции Naive SSE2 и Naive AVX512 от слова наивный
Похоже у остальных матрица сбоит

На моем семпле из #130 для варианта с альфой расклад немного поменялся:
Naive SSE2Naive AVX512x128 origx128 modx128 asmx128 AVX2
8,95-8,970,470,230,53
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
07.04.2020, 14:09
У меня относительно мощный ноут, но:
  • Замусоренная замученная Win10 x64;
  • Нехватка места на диске "C:";
  • Ноут почему-то терпеть не может режим гибернации (так и не понял что не так, может в ОС драйвера кривые);
  • Несмотря на это, последние месяца полтора я ежедневно отправлял его исключительно в гибернацию;
Результаты на замученном:

Naive SSE2Naive AVX512x128 origx128 modx128 asmx128 AVX2
#137 cnv.bmp & #137 smp.bmp
{896x536} 2,953 msN/A{896x536} 12,578 ms{896x536} 3,453 ms{896x536} 2,110 ms{896x536} 5,218 ms
#137 cnv.bmp & #137 smp_alpha.bmp
{896x536} 83,031 ms N/A{896x536} 12,407 ms{896x536} 3,406 ms{896x536} 2,109 ms{896x536} 4,813 ms

Добавлено через 48 минут
Результаты после нормальной перезагрузки:

Naive SSE2Naive AVX512x128 origx128 modx128 asmx128 AVX2
#137 cnv.bmp & #137 smp.bmp
{896x536} 1,406 msN/A{896x536} 5,609 ms{896x536} 1,594 ms{896x536} 0,937 ms{896x536} 2,328 ms
#137 cnv.bmp & #137 smp_alpha.bmp
{896x536} 51,860 ms N/A{896x536} 5,656 ms{896x536} 1,578 ms{896x536} 0,968 ms{896x536} 2,187 ms

Добавлено через 11 минут
Дополнительный тест:

Naive SSE2Naive AVX512x128 origx128 modx128 asmx128 AVX2
#130 cnv1.bmp & #130 smp.bmp
{NONE} 33,766 msN/A{1652x942} 8,391 msAV{NONE} 1,781 ms{NONE} 4,385 ms
#130 cnv1.bmp & #133 smp.bmp
{1652x942} 13,156 msN/A{1652x942} 9,031 ms{1652x942} 0,484 ms{1652x942} 0,250 ms{1652x942} 0,610 ms

Добавлено через 16 минут
хммм.....

Naive SSE2Naive AVX512x128 origx128 modx128 asmx128 AVX2
#45 rosrc32.bmp & #45 ro32.bmp
{NONE} 0 msN/AAVAVAVAV
#102 rosrc32.bmp & #102 ro32fu.bmp
{1354x1072} 13,953 msN/A{1354x1072} 10,171 ms{1354x1072} 0,328 ms{1354x1072} 0,203 ms{1354x1072} 0,421 ms
#102 rosrc32.bmp & #45 ro32.bmp
{NONE} 0 msN/AAVAVAVAV
0
07.04.2020, 21:04

Не по теме:

ого...
Один из вылетевших с AV процессов оказывается остался висеть...
И уже почти 9 часов что-то делает (без окон), отжирая 12-15% процессора...
А я-то думаю - что комп так усиленно гудит, вроде ж всё ресурсоёмкое давно выключил...

0
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
10.04.2020, 22:49  [ТС]
Сейчас протестировал, x128 orig даёт ложное срабатывание. Семплы прилагаю.
Вложения
Тип файла: rar nosmp.rar (28.9 Кб, 14 просмотров)
0
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
10.04.2020, 23:29  [ТС]
А, хотя это оно типа в углу находит если не находит. Легко исправить.

Добавлено через 3 минуты
В начале дописать Result:=Point(-1,-1);

Добавлено через 28 минут
В FindInRegionSSE2Naive никак не могу поправить баг, почему не находит в 0,0. Типа чтобы в ласт столбце находил надо jne @row заменить на jge @row. А вот если jne @col заменить на jge @col, то оно не вылетает но начинает находить вообще не там где надо, ломается выравнивание.
0
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
11.04.2020, 00:39  [ТС]
Вот, поправил баги с божьей помощью. Теперь в углах находит. Осталось оформить всё по красоте.
Вложения
Тип файла: rar AllAlgs.rar (2.33 Мб, 20 просмотров)
0
68 / 33 / 11
Регистрация: 18.07.2014
Сообщений: 263
02.09.2021, 20:03  [ТС]
Немножко некропостинг, но так как тут мне реально очень помогли ощущаю за собой ответственность то просто оставлю это здесь. Только недавно руки дошли применить код в основном проекте, и повыласили баги со смещениями. Посидев дня три-четыре я эти баги исправил.

Вот версия дельфийская, форматирование кода оставил по максимуму оригинальное:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
function FindInRegionMod(Src:HBitmap; _x,_y,dx,dy: Integer; Sample:HBitmap):TPoint;stdcall;
label
  _exit, notfound;
var
  x, y, i,j,k, width, height, delta: integer;
  smp:                               array of record
                                              color,i: dword;
                                              end;
  pixels:                            array of dword;
  _Src,_Sample:                      BITMAP;
begin
  GetObject(Src,sizeof(BITMAP),@_Src);
  GetObject(Sample,sizeof(BITMAP),@_Sample);
  i:=_Sample.bmHeight*_Sample.bmWidth;
  j:=0;
  k:=(_Sample.bmHeight-1)*_Src.bmWidth+_Sample.bmWidth-1 + (_Src.bmHeight-dy-1)*_Src.bmWidth+_x;
  x:=_Sample.bmWidth;
  Width:=_Src.bmWidth-_Sample.bmWidth;
  SetLength(smp,i);
  pointer(pixels):=_Sample.bmBits;
  for i:=i-1 downto 0 do
  begin
    smp[j].color:=pixels[i];
    smp[j].i    :=k;
    dec(j,shortint(PansiChar(@pixels[i])[3]));
    dec(k);
    dec(x);
    if x=0 then
    begin
      x:=_Sample.bmWidth;
      dec(k,Width);
    end;
  end;
  SetLength(smp, j);
  pointer(pixels):=_Src.bmBits;
  Width :=dx-_x-_Sample.bmWidth+1;
  Height:=dy-_y-_Sample.bmHeight+1;
  k:=0;
  delta :=_Src.bmWidth-Width-1;
  y     :=Height;
  repeat
    x:=Width;
    repeat
      i:=j-1;
      repeat
        if pixels[k+smp[i].i]<>smp[i].color then
          goto notfound;
        dec(i);
      until i<0;
      goto _exit;
      notfound:
      inc(k);
      dec(x);
    until x<0;
    inc(k,delta);
    dec(y);
  until y<0;
  Result.x:=-1;
  Result.Y:=-1;
  dword(pixels):=0;
  exit;
  _exit:
  Result.x:=Width-x+_x;
  Result.y:=y+_y;
  dword(pixels):=0;
end;
Вот версия ассемблерная. Но так как ассемблер я знаю плохо может стать что-то неожиданное. Я протестил, вроде работает как надо.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
function FindInRegionASM(Src:HBitmap; _x,_y,_dx,_dy: Integer; Sample:HBitmap):TPoint;stdcall;assembler;
asm
  //push ebp
  //mov  ebp,esp
  pushad
  sub   esp,64
  push  esp                               //_Src
  push  24
  push  dword[esp+116]                    //Src
  call  GetObject
  lea   eax,[esp+24]                      //_Sample
  push  eax
  push  24
  push  dword[esp+136]                    //Sample
  call  GetObject
  add   esp,64
  mov   eax,[esp-40+BITMAP.bmWidth]       //[_Sample.bmWidth]
  mul   [esp-40+BITMAP.bmHeight]          //[_Sample.bmHeight]
  neg   eax
  lea   ebx,[esp+eax*8-64]
  neg   eax
  xor   edi,edi //j:=0??
  mov   esi,[esp-40+BITMAP.bmBits]        //[_Sample.bmBits]
  // k
  mov   ecx,[esp-40+BITMAP.bmHeight]      //[_Sample.bmHeight]
  dec   ecx
  imul  ecx,[esp-64+BITMAP.bmWidth]       //[_Src.bmWidth]
  add   ecx,[esp-40+BITMAP.bmWidth]       //[_Sample.bmWidth]
  dec   ecx
  // My k part
  add ecx,[esp+48] //+_x
  mov edx,[esp-64+BITMAP.bmHeight] //[_Src.Height]
  sub edx,[esp+60] //-dy
  dec edx //-1
  imul  edx,[esp-64+BITMAP.bmWidth] //*_Src.bmWidth
  add ecx,edx //+(_Src.bmHeight-dy-1)*_Src.bmWidth
  //
  mov   edx,[esp-64+BITMAP.bmWidth]       //[_Src.bmWidth]
  sub   edx,[esp-40+BITMAP.bmWidth]       //[_Sample.bmWidth]
  mov   [esp-4],edx
  mov   ebp,[esp-40+BITMAP.bmWidth]       //[_Sample.bmWidth]
  @prep:mov  edx,[esi+eax*4-4]
        mov  [ebx+edi*8],ecx
        mov  [ebx+edi*8+4],edx
        sar  edx,31
        sub  edi,edx
        dec  ecx
        dec  ebp
        jne @next
          mov ebp,[esp-40+BITMAP.bmWidth] //[_Sample.bmWidth]
          sub ecx,[esp-4]
        @next:
        dec eax
  jne @prep
  movq  mm0,[esp+56]                      //_dx/_dy
  psubd mm0,[esp+48]                      //_x/_y
  psubd mm0,[esp-40+BITMAP.bmWidth]       //qword[_Sample.bmWidth]
  movq  [esp-8],mm0                       //width/height
  inc [esp-4]
  inc [esp-8]
  emms
  mov   eax,[esp-64+BITMAP.bmWidth]       //[_Src.bmWidth]
  sub   eax,[esp-8]                       //width
  dec eax
  mov   [esp-16],eax                      //delta
  shl   [esp-16],2
  xor eax,eax //k:=0; ^old k
  add   eax,[esp-64+BITMAP.bmBits]        //[_Src.bmBits]
  mov   ebp,[esp-4]
  @row:mov esi,[esp-8]                    //Width
       @col:mov ecx,edi                   //smpllen
            @b:mov edx,[ebx+ecx*8-8]
               mov edx,[eax+edx*4]
               cmp edx,[ebx+ecx*8-4]
               jne @notfound
               dec ecx
            jne @b
            jmp @exit
            @notfound:
            add eax,4
            dec esi
       jnl @col
       add eax,[esp-16]                   //delta
       dec ebp
  jge @row
  mov eax,[esp+40]                        //result
  mov dword[eax],-1
  mov dword[eax+4],-1
  popad
  pop ebp
  ret 24
  @exit:
  mov eax,[esp+40]                        //result
  neg esi
  add esi,[esp-8]                         //Width
  add esi,[esp+48]                        //_x
  mov [eax],esi
  add ebp,[esp+52]                        //_y
  mov [eax+4],ebp
  popad
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.09.2021, 20:03

Побитовые операции
Выбрать алгоритм, составить его блок-схему и программу для решения выбранного варианта задания. Во всех вариантах предполагается, что...

Побитовые операции
Всем доброго утра. Дана такая задача: есть два чсила,поменять местами 2 последние цифры этих чисел между собой, т.е. 2 последних Х заменить...

Побитовые операции
От друга услышал идею о побитовой сортировки имен (например). К примеру, если у нас набор структурных переменных с анкетами работников, и...

Побитовые операции
Задача: битовый образ 8*8 задается при помощи 8 байт, каждый байт состоит, соответственно, из 8 бит, бит={0,1}; при помощи побитовых...

Побитовые операции
Помогите решить несколько задач по битовым операциям,они все малы по реализации. И объяснить начиная с 3 задачи,что нужно сделать?А то не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
151
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru