Форум программистов, компьютерный форум, киберфорум
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/76: Рейтинг темы: голосов - 76, средняя оценка - 4.64
 Аватар для SeryZone
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1

Написание программы с SSE. Перевод

04.09.2013, 21:40. Показов 15019. Ответов 115
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Недавно строил классическое множество Мандельброта, использовал ранее созданные алгоритмы другими людьми, всё строило хорошо. Но т.к. Я вывел собственную (несложную) формулу для построения аналога, передо мной встала большая проблема: на SSE я не профи, да и с алгоритмом парится - ушло на построение очень много времени, а код я порвал в клочья.
Ближе к теме. Формула классического фрактала - Z = Z2+C
Моя формула - Z = Z2 + C + CENTER
На простейшем языке Delphi код выглядел так:

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
function cAbs(z: TComplex): extended; register;
// z :--> |z|
asm
         FLD TComplex.im [EAX]
         FMUL ST, ST
         FLD TComplex.re [EAX]
         FMUL ST, ST
         FADD
         FSQRT
end;
 
function cadd(z1, z2: TComplex): TComplex; register;  //сложение
asm
         FLD TComplex.re [EAX]
         FLD TComplex.re [EDX]
         FADD
         FSTP TComplex.re [ECX]
         FLD TComplex.im [EAX]
         FLD TComplex.im [EDX]
         FADD
         FSTP TComplex.im [ECX]
end;
 
function cSqr(z: TComplex): TComplex; register; //возведение в квадрат комплексного числа
// z :--> z^2
asm
         FLD TComplex.im [EAX]
         FLD ST
         FMUL ST, ST
         FLD TComplex.re [EAX]
         FLD ST
         FMUL ST, ST
         FXCH ST(3)
         FMUL
         FADD ST, ST
         FSTP TComplex.im [EDX]
         FSUB
         FSTP TComplex.re [EDX]
end;
 
function fractal_mandelbrot(c,center:tComplex):Longint;//вычисление
var w:Longint;
z:TComplex;
izf:Double;
begin
  z.re:=0;
  z.im:=0;
  for Result:=0 to iter do begin
    //возводим в квадрат
    z:=cSqr(z);
    //прибавляем оригинал
    z:=cadd(z, c);
    z:=Cadd(z, center);
    //выясняем, больше ли модуль, чем нужно?
    if(cabs(z) > 4)then exit;
  end;
end;
 
procedure Build_fractal()
begin
for iy := 0 to 1919 do
    begin
    for ix := 0 to 12400 do
    begin
      n := fractal_mandelbrot(zData[ix,iy],center);
      if(n >= iter)then
      begin
        NumIter[ix,iy]:=-1;
      end
      else
      begin
        NumIter[ix,iy]:=n;
      end;
end;
Суть задачи - включая циклы переписать весь этот код с функциями с SSE конструкциями (если возможно). Господа, подскажите, где можно почитать о построении алгоритма, и вообще, что можно сделать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.09.2013, 21:40
Ответы с готовыми решениями:

SSE. Подение программы
Привет ребята! Такое дело, есть задание: Обработать массивы из 8 элементов по следующему выражению: F=A-B*C-D , i=1...8; ...

Непонятки с SSE
Есть несложная формула, пока что, без логарифмов и экспонент=) С FPU проблем не возникло. Вот, кстати, формула: ColorIndex := round(...

Написание программы с использованием файловых переменных. Разработка программы для работы с текстовым файлом
Помогите пожалуйста : С помощью текстового редактора создать текстовый файл file1. Переписать строки файла file1 в новый текстовый файл...

115
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
18.09.2013, 09:32
Студворк — интернет-сервис помощи студентам
Доделал рендер без использования текстуры. Кнопками "+" и "-" можно увеличивать и уменьшать детализацию (по умолчанию 128 итераций). При слишком большой детализации на Intel GMA x4500 вылетает видеодрайвер и система встаёт колом
Вложения
Тип файла: rar MandelBrotGPU2.rar (21.2 Кб, 14 просмотров)
0
 Аватар для snake32
3582 / 1712 / 236
Регистрация: 26.02.2009
Сообщений: 8,638
Записей в блоге: 6
18.09.2013, 11:58
murderer, я тут случайно нашёл ещё один вариант Мандельброта на GLSL + QT. Там кстати цвет пикселя тоже генерится в шейдере только через косинусы:
C++
1
2
3
4
gl_FragColor = vec4((-cos(0.025*float(n))+1.0)/2.0,
                      (-cos(0.08*float(n))+1.0)/2.0,
                      (-cos(0.12*float(n))+1.0)/2.0,
                       1.0);
где n - кол-во итераций
И ещё реализуется двойная точность, как в железе(часть 3), так и путём эмуляции(часть 2).
https://www.thasler.org/blog/?p=45

Добавлено через 4 минуты
но мне кажется быстрее всё-таки одна выборка из текстуры нежели 3 синуса или 3 косинуса... надо тестить

Добавлено через 30 секунд
к тому же с текстурой более гибкий вариант
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
18.09.2013, 12:25
Там кстати цвет пикселя тоже генерится в шейдере только через косинусы
Я выводил формулы по этой статье. Рисовал графики на бумажке, потом в Excel`е...

но мне кажется быстрее всё-таки одна выборка из текстуры
У генерации другие преимущества: точность и размер (у меня exe-файл уменьшился на 1Кб, а это 25%).

Добавлено через 8 минут
И ещё реализуется двойная точность, как в железе(часть 3), так и путём эмуляции(часть 2).
Если в шейдере с эмуляцией float заменить на double, то получится double-double 128 bit?
0
 Аватар для snake32
3582 / 1712 / 236
Регистрация: 26.02.2009
Сообщений: 8,638
Записей в блоге: 6
18.09.2013, 14:56
Цитата Сообщение от murderer Посмотреть сообщение
Если в шейдере с эмуляцией float заменить на double, то получится double-double 128 bit?
ога. только скорость отрисовки кадра тоже будет double-double часов
Цитата Сообщение от murderer Посмотреть сообщение
У генерации другие преимущества: точность и размер (у меня exe-файл уменьшился на 1Кб, а это 25%).
про точность не спорю, хотя текстуру я тоже могу достаточно большую подключить. А вот размер в современном мире думаю мало кого интересует - быстрый интернет, дешёвые гигабайты дискового пространства и всё такое...
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
20.09.2013, 08:58
Рассмотрим сложение в шейдере с эмуляцией (в комментах развёрнутое выражение)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
vec2 ds_add (vec2 dsa, vec2 dsb)
{
 vec2 dsc;
 float t1, t2, e;
 
 t1 = dsa.x + dsb.x;
 e = t1 - dsa.x;                                          //e = dsa.x + dsb.x - dsa.x = dsb.x
 t2 = ((dsb.x - e) + (dsa.x - (t1 - e))) + dsa.y + dsb.y; //(dsb.x - dsb.x) + (dsa.x - (dsa.x + dsb.x - dsb.x) = 0
 
 dsc.x = t1 + t2;                                         //dsa.x + dsb.x + 0
 dsc.y = t2 - (dsc.x - t1);                               //0 - ((dsa.x + dsb.x) - (dsa.x + dsb.x)) = 0
 return dsc;
}
Итого получается, что никакой эмуляции нет - обычный float! Что за?!

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

Добавлено через 18 минут
Нашёл описание на русском

Если я правильно понял идею сложение должно выглядеть примерно так:
res.x = a.x+b.x
res.y = a.y+b.y
res.x = res.x+trunc(res.y)*2-31
res.y = frac(res.y)
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
20.09.2013, 11:32
Цитата Сообщение от murderer Посмотреть сообщение
никакой эмуляции нет - обычный float!
Так это и есть эмуляция. Берется массив float (double или т.п.), где каждый элемент отвечает за свою "часть" общего большого числа. Под это дело пишутся функции(процедуры) сложения, умножения и т.д. И юзер типа работает с числами высокой точности (если внутрь не полезет) . Длинная арифметика, так сказать.

Биилиотека, на которую книжка ссылается: qd-library
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
20.09.2013, 11:52
FIL
Так ведь в функции ds_add все формулы сокращаются и получается
C
1
2
3
4
vec2 ds_add (vec2 dsa, vec2 dsb)
{
    return vec2(dsa.x+dsb.x, 0.0);
}
Это называется эмуляция?
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
20.09.2013, 12:53
Сокращается, если рассматривать это все с точки зрения работы с целыми числами.
Рассмотрим такой пример (некий тип с плавающей запятой, вмещающий 2 десятичные цифры):
a = 0.1200, где a.x = 0.12; a.y = 0.0000
b = 0.0034, где b.x = 0.00; b.y = 0.0034
тогда:
t1 = 0.12 + 0.00 = 0.12
e = 0.12 - 0.12 = 0.00
t2 = ((0.00 - 0.00) + (0.12 - (0.12 - 0.00))) + 0.0000 + 0.0034 = 0.0034
c.x = 0.12 + 0.0034 = 0.12
c.y = 0.0034 - (0.12 - 0.12) = 0.0034
т.о. получаем: с = 0.1234
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
20.09.2013, 13:29
Я ошибся при сокращении, будет так
Assembler
1
return vec2(dsa.x + dsb.x + dsa.y + dsb.y, 0.0)
Но это в корне не правильно

Теперь как это должно быть.

Смотри, основной принцип double-double - это разбиение одной переменной на две. Допустим у нас есть число 0.4888129899481270. Допустим теперь, что точности одной переменной не достаточно - разбиваем на 2 части: 0.48881298 и 0.99481270.

Пример сложения (сферический в вакууме, просто, чтобы понять принцип). Складываем само с собой
low = 0.48881298 + 0.48881298 = 0.97762596
high = 0.99481270 + 0.99481270 = 1.9896254
low = low+trunc(high)*10-8=0.97762596+trunc(1.9896254)*10-8=0.97762596+0.00000001=0.97762597
high = frac(high)=frac(1.9896254)=0.9896254

Правильность можно проверить в калькуляторе 0.4888129899481270+0.4888129899481270=0. 977625979896254

10-8 я взял просто для наглядности для float насколько я понимаю должно быть 2-23 т.к. там 23 бита мантиссы.

Добавлено через 1 минуту
В общем со сложением понятно, теперь надо понять умножение...

Добавлено через 5 минут
Сокращается, если рассматривать это все с точки зрения работы с целыми числами.
Нет разницы. Там даже необязательно всё сокращать, достаточно этого
dsc.x = t1 + t2;
dsc.y = t2 - (dsc.x - t1);
Если dsc.x = t1 + t2, то dsc.y = t2 - (dsc.x - t1) = t2 - (t1+t2 - t1) = 0

Это <censored>
 Комментарий модератора 
Использование нецензурных выражений запрещено.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
20.09.2013, 13:45
Число разбивается по-другому:
0.4888129899481270
high = 0.48881298
low = 0.0000000099481270

Поэтому, нуля там не будет. Посмотри мой пример.
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
20.09.2013, 14:08
Тогда возможно, но я не понимаю как работает перенос. В своём примере я использовал для этого trunc и frac, а тут какая-то магия.

Добавлено через 3 минуты
В любом случае тут возможно переполнение порядка (для float это всего 8 бит) при дальнейшем масштабировании. Я хочу сделать не просто double-double, а произвольно масштабируемую точность, объединив несколько переменных.

Добавлено через 43 секунды
И всё это на GPU.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
20.09.2013, 15:02
Цитата Сообщение от murderer Посмотреть сообщение
не просто double-double, а произвольно масштабируемую точность
С таким подходом тебе придется писать свои процедуры под каждый набор (2, 4, 8, 16 Double и т.д.), которые будут все больше усложняться.
Аналог подобной реализации, только с DWord'ами приведен в этой теме:
https://www.cyberforum.ru/asse... ost5057701

Я пробовал подругому:
Брал за основу Интегеры. Каждый Интегер - 4 цифры числа.
Уперся в то, что на SSE нет деления целых чисел, пришлость кусок на общих регистрах делать, а так все работает.
0
 Аватар для SeryZone
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
20.09.2013, 15:42  [ТС]
FIL, этот код произв. точности очень мощный. Надо только научиться им пользоваться
0
 Аватар для snake32
3582 / 1712 / 236
Регистрация: 26.02.2009
Сообщений: 8,638
Записей в блоге: 6
27.01.2014, 15:00
Up. Может кому-то будет интересно.
Существует низкоуроневый язык для видеокарт (gpu asm)
http://en.wikipedia.org/wiki/ARB_assembly_language
К сожалению, первая версия этого gpu asm'a не поддерживает циклы. Что делает его непригодным для вычисления множества Мандельброта. Возможно, есть более свежие версии, но я таких быстрым просмотром не нашёл (если кто найдёт - буду рад лицезреть). Однако, для видеокарт nVidia, есть расширение NV_gpu_program4, которое уже может гораздо больше(в том числе организовать цикл). Хотя при таком раскладе лучше заюзать CUDA нежели OpenGL (ИМХО)
http://www.renderguild.com/gpuguide.pdf

PS. Попробовал открыть n-дыхание темы
2
 Аватар для SeryZone
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
27.01.2014, 22:38  [ТС]
snake32, про CUDA знаю, но у меня AMD увы =) Про n-дыхание хочу сказать, что прога увеличивает до 10^13 что не даёт должного результата. Есть исходник произвольной точности, но там формула преобразования классическая (т.е. далёкая от экспоненты). Я всё кинуть могу, но если будем сотрудничать.
Вот на CUDA вычислялось: http://vimeo.com/25833277
Оформление видео - ГЭ редкое, но советую почитать описание. Разочарую в том, что исходников нет. Да и на NVidia денег не накопил. Как-то так
0
 Аватар для snake32
3582 / 1712 / 236
Регистрация: 26.02.2009
Сообщений: 8,638
Записей в блоге: 6
28.01.2014, 04:10
Цитата Сообщение от SeryZone Посмотреть сообщение
Вот на CUDA вычислялось: http://vimeo.com/25833277
Оформление видео - ГЭ редкое, но советую почитать описание.
Some 'boring' technical things:
Total frames calculated: 1235 at 512x512 resolution taken at every 2x zooms
Iterations: 8000million/frame at last frame
Hardware: 2x radeon HD6990 950Mhz (15% overclk)
Rendering time: around 16 hours
Где тут нвидиа?
Цитата Сообщение от SeryZone Посмотреть сообщение
прога увеличивает до 10^13 что не даёт должного результата.
Хм... какая точность нужна для достижения результата?
0
 Аватар для SeryZone
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
28.01.2014, 10:01  [ТС]
snake32, Я когда-то пробовал делать на OpenGL, но мои попытки не увенчались успехом. А на ноуте (не моем), где nVidia, там всё работает быстро, как часы, в общем-то.

Ладно. Даже extended позволяет увеличивать до 4*10^15!!! В общем, произвольная точность есть, как юзать - не знаю, знания assembler'а не позволяют мне понять код. В общем, будем делать до 10^128, не ниже. Исходник произвольной позволяет вообще 128 dwords = до 1280 степени десятки, не ниже. Ладно, буду учииить учииииить ассемблер..
0
 Аватар для snake32
3582 / 1712 / 236
Регистрация: 26.02.2009
Сообщений: 8,638
Записей в блоге: 6
17.03.2014, 13:21
Квадро точность на GLSL https://www.thasler.org/blog/?p=143
0
 Аватар для SeryZone
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
17.03.2014, 23:28  [ТС]
snake32, слушай, элементы окна на WinAPI не дашь ссылочку? Меня интересуют сами элементы (Не только кнопка и поле ввода!!!) и диалоги.
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16374 / 7686 / 1080
Регистрация: 11.11.2010
Сообщений: 13,761
18.03.2014, 03:46
SeryZone,
https://www.cyberforum.ru/asse... 51124.html
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.03.2014, 03:46

Перевод текстов, слов и их написание
Сфотографировал полиэтиленовый пакет. На нем две строчки надписи на английском. Сможет кто перевести? Сначала со своим личным...

Написание программы
Напишите программу: ,,Создать массив А(n), где n&lt;=20, содержащие сведения о билете: название станции, номер зоны и цена. Изменить данные в...

Написание программы.
Дано 3 числа.Найти сумму нечетных чисел меньших 11.

написание программы
в автоматизированной информационной системе содержаться анкетные данные сотрудников учреждения в массиве А из 100 элементов содерж года...

Написание программы
В txt документе дана последовательность символов. Написать программу которая будет подсчитывать сколько раз будет повторяться введённый...


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru