Форум программистов, компьютерный форум, киберфорум
K_ILYA_V
Войти
Регистрация
Восстановить пароль
Рейтинг: 3.67. Голосов: 3.

Первый участок конвейера

Запись от K_ILYA_V размещена 20.02.2020 в 21:26

Первая часть конвейера преобразующая глобальные координаты в координаты камеры по шести степеням свободы.
- верх-вниз
- право-влево
- вперед-назад
- поворот вектора направления по оси Х
- поворот вектора направления по оси Y
- поворот вектора направления по оси Z

Assembler
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
vector4 struct
    x real4 ?
    y real4 ?
    z real4 ?
    r real4 ?
vector4 ends
 
vector8 struct
    a real4 ?
    b real4 ?
    c real4 ?
    d real4 ?
    e real4 ?
    f real4 ?
    g real4 ?
    h real4 ?
vector8 ends
 
matrix3_8 struct
    x vector8 <>
    y vector8 <>
    z vector8 <>
matrix3_8 ends
 
kamera struct
    pos  vector4 <>
    dirX vector4 <>
    dirY vector4 <>
    dirZ vector4 <>
kamera ends
 
.data
    cube matrix3_8 << 0.0, 10.0,  0.0,  10.0,  0.0, 10.0,  0.0, 10.0>,\
                    < 0.0,  0.0, 10.0,  10.0,  0.0,  0.0, 10.0, 10.0>,\
                    < 0.0,  0.0,  0.0,   0.0, 10.0, 10.0, 10.0, 10.0>>
 
    kam1 kamera    <<  0.0, 0.0, 0.0,  0.0>,\
                    <  1.0,  0.0,  0.0,  0.0>,\ ; единичный вектор x^2+y^2+z^2=1
                    <  0.0,  1.0,  0.0,  0.0>,\ ; единичный вектор x^2+y^2+z^2=1
                    <  0.0,  0.0,  1.0,  0.0>>  ; единичный вектор x^2+y^2+z^2=1
    
.code
WinMain proc
; подготовительная часть конвеера выполняемая один раз
 
    ; загружаем координаты камеры
    vbroadcastss ymm0,kam1.pos.x
    vbroadcastss ymm1,kam1.pos.y
    vbroadcastss ymm2,kam1.pos.z
    
    ; загружаем вектор направления оси X камеры
    vbroadcastss ymm3,kam1.dirX.x
    vbroadcastss ymm4,kam1.dirX.y
    vbroadcastss ymm5,kam1.dirX.z
    
    ; загружаем вектор направления оси Y камеры
    vbroadcastss ymm6,kam1.dirY.x
    vbroadcastss ymm7,kam1.dirY.y
    vbroadcastss ymm8,kam1.dirY.z
    
    ; загружаем вектор направления оси Z камеры
    vbroadcastss ymm9,kam1.dirZ.x
    vbroadcastss ymm10,kam1.dirZ.y
    vbroadcastss ymm11,kam1.dirZ.z
 
; рабочая часть конвейера выполняемая многократно
r:  vaddps ymm14,ymm0,cube.x
    vaddps ymm15,ymm1,cube.y
    vmulps ymm12,ymm14,ymm3     ; a*x1
    vmulps ymm13,ymm15,ymm4     ; b*y1
    vaddps ymm12,ymm12,ymm13    ; a*x1+b*y1
    vaddps ymm13,ymm2,cube.z
    vmulps ymm13,ymm5,ymm13     ; c*z1
    vaddps ymm12,ymm12,ymm13    ; a*x1+b*y1+c*z1
    vmovaps cube.x,ymm12
    vmulps ymm12,ymm14,ymm6     ; a*x2
    vmulps ymm13,ymm15,ymm7     ; b*y2
    vaddps ymm12,ymm12,ymm13    ; a*x2+b*y2
    vmulps ymm14,ymm14,ymm9     ; a*x3
    vmulps ymm15,ymm15,ymm10    ; b*y3
    vaddps ymm15,ymm14,ymm15    ; a*x3+b*y3
    vaddps ymm13,ymm2,cube.z
    vmulps ymm14,ymm13,ymm8     ; c*z2
    vaddps ymm12,ymm12,ymm14    ; a*x2+b*y2+c*z2
    vmovaps cube.y,ymm12
    vmulps ymm12,ymm13,ymm11    ; c*z3
    vaddps ymm12,ymm12,ymm15    ; a*x3+b*y3+c*z3
    vmovaps cube.z,ymm12
        
WinMain endp
end
обратите внимание что за один проход конвейер параллельно обрабатывает восемь вершин. при самостоятельном задании значений камеры обратите внимание что dirX / dirY / dirZ это единичные перпендикулярные векторы значения которых нельзя задавать произвольно, они должны быть согласованны друг с другом и вычисляться по правилам, в противном случае будет происходит "искажение" координатной плоскости.
Размещено в Без категории
Просмотров 1008 Комментарии 72
Всего комментариев 72
Комментарии
  1. Старый комментарий
    это часом не отсюда?:
    https://books.google.ru/books?id=wPt9DwAAQBAJ
    Запись от untyped размещена 21.02.2020 в 00:37 untyped вне форума
  2. Старый комментарий
    Аватар для Usaga
    Это эти "математические формулы" собрались противопоставлять языку С++? Процессорные инструкции из специализированного набора команд AVX* языку общего назначения? И вы всё ещё считаете моё замечание о сравнении тёплого с мягким не конструктивным?
    Запись от Usaga размещена 21.02.2020 в 05:43 Usaga вне форума
  3. Старый комментарий
    Аватар для K_ILYA_V
    Цитата:
    Сообщение от untyped Просмотреть комментарий
    это часом не отсюда?...
    укажите страницу пожалуйста.
    Запись от K_ILYA_V размещена 21.02.2020 в 06:49 K_ILYA_V вне форума
  4. Старый комментарий
    Аватар для K_ILYA_V
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    ...эти "математические формулы"...специализированного набора команд AVX...
    возможно вы просто не можете понять эти математические формулы? я постараюсь выделить время и написать их в общем виде чтобы вам было понятно.

    специализированный набор команд AVX априори присутствует в довольно большом сегменте домашних персональных компьютеров не говоря уже о том что в линейке "игровых" компьютеров это практически обязательная опция. по этому игнорирование специализированных команд на том основании что они специализированны равнозначно игнорированию специализированной левой руки на том основании что у вас есть не_специализированная права рука. при необходимости можно написать вторую ветвь конвейера для SEE4.0 что гарантирует охват подавляющего количества персональных компьютеров.

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

    ну и наверное самое простое но при этом самое главное, скорость работы написанного мной алгоритм близка к максимально возможной. я искренне сомневаюсь что на с++ можно составить код равнозначный по скорости.
    Запись от K_ILYA_V размещена 21.02.2020 в 07:40 K_ILYA_V вне форума
  5. Старый комментарий
    Аватар для Usaga
    Не надо расписывать ничего. Это не формулы, а инструкции AVX. Т.е. конкретная технология. И эту вещь вы в прошлом посте противопоставили языку С++, приписав последнему какие-то сложности с классами и уровнями доступа. Что, при этом, мешает использовать эти же AVX инструкции из того же С++ мне не совсем ясно.

    Ну и если бы вы сразу сказали, что некоторые математические операции, реализованные в CPU в виде инструкций, быстрее и проще на ассемблере проводить (может быть вставками), я бы не стал докапываться. Ибо было бы честно и конкретно сказано.

    Ну и для полноты картины можете показать то же самое, но на С++, чтобы было видно проблемы от классов и уровней доступа. Ведь такие расчёты в один метод\функцию никак не поместятся?
    Запись от Usaga размещена 21.02.2020 в 09:55 Usaga вне форума
  6. Старый комментарий
    Аватар для K_ILYA_V
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    ...Ну и для полноты картины можете показать то же самое, но на С++, чтобы было видно проблемы от классов и уровней доступа. Ведь такие расчёты в один метод\функцию никак не поместятся?
    ...скорость работы написанного мной алгоритм близка к максимально возможной. я искренне сомневаюсь что на с++ можно составить код равнозначный по скорости.
    Запись от K_ILYA_V размещена 21.02.2020 в 10:22 K_ILYA_V вне форума
  7. Старый комментарий
    Аватар для Алексей1153
    Цитата:
    Сообщение от K_ILYA_V Просмотреть комментарий
    ...скорость работы написанного мной алгоритм близка к максимально возможной. я искренне сомневаюсь что на с++ можно составить код равнозначный по скорости.
    иногда оптимизатор C++ может сделать это даже эффективнее, чем вручную на ассемблере

    в общем случае разницы практически не будет
    Запись от Алексей1153 размещена 21.02.2020 в 11:10 Алексей1153 вне форума
  8. Старый комментарий
    Аватар для K_ILYA_V
    Цитата:
    Сообщение от Алексей1153 Просмотреть комментарий
    ...в общем случае разницы практически не будет
    могу я увидеть подтверждение ваших слов виде куска кода который я смогу посмотреть в дизассемблере?
    Запись от K_ILYA_V размещена 21.02.2020 в 12:35 K_ILYA_V вне форума
  9. Старый комментарий
    Аватар для Алексей1153
    Цитата:
    Сообщение от K_ILYA_V Просмотреть комментарий
    могу я увидеть подтверждение ваших слов виде куска кода который я смогу посмотреть в дизассемблере?
    увидеть в дизассемблере - запросто. Пишешь код на C++, запускаешь на отладку и способом, присущим используемой IDE, отображаешь дизассемблер. Нужно при этом включить оптимизацию (по умолчанию в дебажной версии оптимизации нет)
    Запись от Алексей1153 размещена 21.02.2020 в 12:47 Алексей1153 вне форума
  10. Старый комментарий
    Аватар для Usaga
    Цитата:
    ...скорость работы написанного мной алгоритм близка к максимально возможной. я искренне сомневаюсь что на с++ можно составить код равнозначный по скорости.
    Конкретно ЭТИ операции - да, ибо у процессора есть инструкции специализированные. Но в прошлом посте вы не конкретизировали, что именно можно так ускорить, а сказали в общем, что любые математические расчёты так проще делать и быстрее, что неверно в принципе.
    Запись от Usaga размещена 22.02.2020 в 06:04 Usaga вне форума
  11. Старый комментарий
    Аватар для K_ILYA_V
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    ...в прошлом посте вы не конкретизировали, что именно можно так ускорить, а сказали в общем, что любые математические расчёты так проще делать и быстрее, что неверно в принципе.
    я сказал
    Цитата:
    Писать математические алгоритмы и конвейеры на asm не соизмеримо проще чем на С++...
    и в подтверждение своих слов написал небольшой кусок кода, и хотя жизненные обстоятельства постоянно меня отвлекают я постараюсь до конца выходных написать следующий маленький кусочек кода.

    и да я совершенно с вами согласен. ПРАКТИЧЕСКИ любые математические расчеты сложнее сложения/вычитания удобней делать на асме. в дальнейшем я планирую по мере готовности опубликовать код параллельного размножения и комбинации координат, а в алгоритмах заполнения экранной плоскости применить технологию вычисления 16 (шестнадцати) вершин одновременно.
    Запись от K_ILYA_V размещена 22.02.2020 в 09:20 K_ILYA_V вне форума
  12. Старый комментарий
    Цитата:
    постараюсь до конца выходных написать следующий маленький кусочек кода.
    Действительно, как удобно писать на ассемблере то! Неделю на маленький кусочек кода.

    Извиняюсь. У меня сегодня - понедельник, а не суббота
    Запись от IamLost размещена 22.02.2020 в 09:38 IamLost вне форума
  13. Старый комментарий
    Аватар для K_ILYA_V
    Цитата:
    Сообщение от IamLost Просмотреть комментарий
    Действительно, как удобно писать на ассемблере то! Неделю на маленький кусочек кода.

    Извиняюсь. У меня сегодня - понедельник, а не суббота
    моя работа не связанна с программированием и пишу код я в свободное от основной деятельности время. ктому же большую часть времени занимает не набор текста на экране а проработка алгоритмов, которую к большому сожалению мало кто может увидеть в ассемблере. такая вот пичалка.

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

    я был бы рад если бы вы продемонстрировали бы мне код на с++ выполняющий аналогичный алгоритм чтобы можно было сравнить сложность/простоту составления кода по выполнению указанного алгоритма.
    Запись от K_ILYA_V размещена 22.02.2020 в 09:48 K_ILYA_V вне форума
  14. Старый комментарий
    Аватар для K_ILYA_V
    Цитата:
    Сообщение от Алексей1153 Просмотреть комментарий
    ...
    я расцениваю ваш ответ как неспособность подтвердить свое утверждение реальным примером.
    Запись от K_ILYA_V размещена 22.02.2020 в 11:37 K_ILYA_V вне форума
  15. Старый комментарий
    Цитата:
    вот опубликованный мной кусочек кода это скалаярно-векторное перемножение/сложение векторов для нахождение нормальных векторов
    А какой в этом смысл? Насколько это быстрей чем код, который сгенерит компилятор С++?
    Запись от IamLost размещена 22.02.2020 в 11:43 IamLost вне форума
  16. Старый комментарий
    Аватар для K_ILYA_V
    Цитата:
    Сообщение от IamLost Просмотреть комментарий
    А какой в этом смысл? Насколько это быстрей чем код, который сгенерит компилятор С++?
    смысл в том чтобы быть лучше чем все (алгоритмы)
    предположительно не менее чем восьми кратно и более
    Запись от K_ILYA_V размещена 22.02.2020 в 11:48 K_ILYA_V вне форума
  17. Старый комментарий
    Аватар для Алексей1153
    Цитата:
    Сообщение от K_ILYA_V Просмотреть комментарий
    я расцениваю ваш ответ как неспособность подтвердить свое утверждение реальным примером.
    я и не собирался подтверждать - я рассказал, как это сделать, мне самому это нет смысла делать
    Запись от Алексей1153 размещена 22.02.2020 в 12:19 Алексей1153 вне форума
  18. Старый комментарий
    Аватар для K_ILYA_V
    Цитата:
    Сообщение от Алексей1153 Просмотреть комментарий
    ...мне самому это нет смысла делать
    какой тогда смысл вам/мне продолжать диалог?
    Запись от K_ILYA_V размещена 22.02.2020 в 12:26 K_ILYA_V вне форума
  19. Старый комментарий
    Цитата:
    предположительно не менее чем восьми кратно и более
    Так это только догадки?
    Запись от IamLost размещена 22.02.2020 в 12:33 IamLost вне форума
  20. Старый комментарий
    Аватар для XLAT
    Цитата:
    Сообщение от K_ILYA_V Просмотреть комментарий
    смысл в том чтобы быть лучше чем все (алгоритмы)
    предположительно не менее чем восьми кратно и более
    нет.
    в реальности будет так:
    1. вычисление матрицы проекции осуществляется ОДИН раз на фрейм для достаточно большого размера массива вертексов.
    2. далее эту матрицу нужно будет применить к каждому элементу этого массива.
    3. чтение данных этого массива из памяти было, есть и будет в 200 раз медленнее, чем чтение данных из кэша.
    4. ваше 8 раз упрётся в гораздо более медленную внешнюю память.

    Ваш VAX2 будет хорош на вычислениях, когда он многократно был бы применён на одних и тех же данных,
    которые бы находились в кеше.(например какое-нить кодирование-декодирование) А здесь не тот случай.

    В реальности делают так:
    1. Вычисляют матрицу проекции на цпу самыми древними инструкциями, которые есть во всех процессорах 99% компах планеты.
    2. Отсылают её в шейдер.
    3. в гпу этот шейдер в параллельном режиме делает проекцию сразу для всей кучи вертексов.

    И это переплюнет ваш софтвар в 1000 раз на офисной видюшке!
    Запись от XLAT размещена 22.02.2020 в 13:11 XLAT вне форума
    Обновил(-а) XLAT 22.02.2020 в 13:20
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.