Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
14 / 11 / 3
Регистрация: 25.10.2018
Сообщений: 113
1

Ассемблерная вставка с AVX-инструкциями

02.05.2019, 18:07. Показов 1135. Ответов 7
Метки нет (Все метки)

Здравствуйте, я бы хотел обрабатывать числа большой длины, и хотел бы написать свои функции на ЯВУ, которые работают быстро, я бы хотел обрабатывать всё напрямую в регистрах, например числа брать из файла, грузить допустим значения по 512 бит в векторные регистры и складывать их. Только вот не знаю ничего. Литературы по AVX не нашёл, мне бы хотя бы табличку с инструкциями с тем что они делают, похожую например на систему команд для 32-разрядного процессора 80386.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2019, 18:07
Ответы с готовыми решениями:

Ассемблерная вставка
Только начали изучать ассемблерную вставку в С++....первую лабу я кое-как сам сделал (там...

Ассемблерная вставка в С++
Задача: дан одномерный массив из 10 элементов, найти минимальный элемент массива, а также среднее...

Ассемблерная вставка, одномерный масив.
Только начали изучать ассемблерную вставку в С++....первую лабу я кое-как сам сделал (там...

Ассемблерная вставка в с++
С помощью логических операций реализуйте запись битов в данной ячейки памяти, размером в 2 байта, в...

7
14 / 11 / 3
Регистрация: 25.10.2018
Сообщений: 113
02.05.2019, 18:45  [ТС] 2
Вот, что я только что сумел реализовать (сложение двух 256-битных чисел), но не думаю, что это совсем верно
C++
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
#include<iostream>
#include<windows.h>
using namespace std;
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    system("cls");
    int b[8] = { 1, 1, 1, 1, 1, 1, 1, 1 };  // = 0000 0001 0000 0001 0000 0001 0000 0001 0000 0001 0000 0001 0000 0001 0000 0001 (in hex)
    for (int i = 0; i < 8; i++)
    {
        cout <<hex<< b[i] << " ";
    }
    _asm
    {
        vmovupd ymm0, [b]
        vaddpd ymm0, ymm0, ymm0;            // Насколько я понял ymm0 = ymm0 + ymm0
        vmovupd [b], ymm0
    }
    cout << endl;
    for (int i = 0; i < 8; i++)
    {
        cout <<hex<< b[i] <<" ";
    }
    system("pause");
    return 0;
}
 
}
Миниатюры
Ассемблерная вставка с AVX-инструкциями  
0
Эксперт С++
2410 / 2020 / 301
Регистрация: 03.05.2011
Сообщений: 4,502
Записей в блоге: 15
04.05.2019, 20:34 3
Цитата Сообщение от PeterVl Посмотреть сообщение
но не думаю, что это совсем верно
естественно это не верно
__asm работает только на 32 битном компиляторе.
чтобы использовать 128 битные и больше регистры, ваше приложение изначально должно быть 64 битным.

Цитата Сообщение от PeterVl Посмотреть сообщение
Литературы по AVX не нашёл
доки интела, или туторы на ютубе
2
1142 / 1069 / 170
Регистрация: 19.02.2010
Сообщений: 3,219
04.05.2019, 22:53 4
Цитата Сообщение от _lunar_ Посмотреть сообщение
чтобы использовать 128 битные и больше регистры, ваше приложение изначально должно быть 64 битным.

128битный SSE вполне себе нормально работал на 32битных пеньках3, под 32битными Вин2000/ВинХР.
И до сих пор может жить в 32битных прогах независимо от разрядности (32 или 64) современного процессора.
У 64битных процессоров просто выросло в 2 раза число доступных SSE-регистров (увеличилось с 8 до 16).
ЕМНИП, аналогично и для AVX - в 32разрядных прогах оно возможно, но видит только 8 регистров.


Цитата Сообщение от PeterVl Посмотреть сообщение
но не думаю, что это совсем верно
Совершенно неверно.
SSE и AVX/AVX512 позволяют работать ТОЛЬКО со СТАНДАРТНЫМИ типами целых и плавучих данных. Т.е. 32 и 64разрядные плавучие, и 8/16/32/64разрядные целые.
В длинный (128/256/512бит) регистр грузится либо одно такое число (в младшие биты), либо несколько (на всю ширину регистра).
Арифм.операции, соответственно, работают с лежащими в таком регистре числами ПО-ОТДЕЛЬНОСТИ. Т.е. если при выполнении команды сложения целых в младшем 32битном целом (если складываем 32разрядные целые) возникло переполнение - то оно в следующие биты НЕ ПЕРЕНОСИТСЯ, а обрабатывается по правилам работы с 32разрядным целым. Аналогично и для всех остальных компонент регистра - результат ограничен битностью данных, а не всего регистра.
Т.е. нет 128/256/512разрядной арифметики - SIMD-команды не для этого сделаны.
0
Эксперт С++
2410 / 2020 / 301
Регистрация: 03.05.2011
Сообщений: 4,502
Записей в блоге: 15
05.05.2019, 09:47 5
VTsaregorodtsev, причём здесь пеньки и sse? Что за бред вы несёте?
ещё раз прочитайте, что я написал.

в дальнейшую полемику вдаваться не собираюсь..
1
1142 / 1069 / 170
Регистрация: 19.02.2010
Сообщений: 3,219
05.05.2019, 20:47 6
Цитата Сообщение от _lunar_ Посмотреть сообщение
причём здесь пеньки и sse?
Интересно, к чему тогда относятся 128бит в этих Ваших словах?
Цитата Сообщение от _lunar_ Посмотреть сообщение
чтобы использовать 128 битные и больше регистры
К каким таким регистрам, кроме как к SSE, а?
А SSE вполне себе существовал во времена 32разрядных процессоров и 32разрядных ОС. И Интел это сделал не для того, чтобы оно просто было в процессорах незадействованным - а чтобы народ=программисты (ну, и компиляторы, которые поумнее) это юзал. Не требуя при этом обязательности перехода к 64разрядным прогам/ОС/процессорам.

Цитата Сообщение от _lunar_ Посмотреть сообщение
в дальнейшую полемику вдаваться не собираюсь..
Спасибо, я всё понял
0
14 / 11 / 3
Регистрация: 25.10.2018
Сообщений: 113
13.05.2019, 15:28  [ТС] 7
Арифм.операции, соответственно, работают с лежащими в таком регистре числами ПО-ОТДЕЛЬНОСТИ. Т.е. если при выполнении команды сложения целых в младшем 32битном целом (если складываем 32разрядные целые) возникло переполнение - то оно в следующие биты НЕ ПЕРЕНОСИТСЯ, а обрабатывается по правилам работы с 32разрядным целым. Аналогично и для всех остальных компонент регистра - результат ограничен битностью данных, а не всего регистра.
Т.е. нет 128/256/512разрядной арифметики - SIMD-команды не для этого сделаны.
Я в этом уже убедился, когда пытался отладить это большими числами. Но я по-прежнему ищу какой-нибудь способ посчитать большие числа
0
14 / 11 / 3
Регистрация: 25.10.2018
Сообщений: 113
14.05.2019, 03:24  [ТС] 8
доки интела, или туторы на ютубе
Спасибо за информацию. Буду тщательно изучать и, может быть, найду ответы на свои вопросы.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2019, 03:24

Ассемблерная вставка
Всем привет. Код ниже отлично обрабатывается компилятором mingw QString...

Ассемблерная вставка на С++
Добрый день, уважаемые. Столкнулся с большой проблемой когда понадобилось для увеличения скорости...

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

Ассемблерная вставка в С++
Когда в b у нас число больше 127 программа работает неправильно помогите исправить .. очень нужно...

Ассемблерная вставка
Нужно заменить в русской строке похожие буквы латиницей. Ввод и вывод - на С++, всё остальное - на...

C++ и ассемблерная вставка
Всем доброго времени суток. Необходимо было написать программу, которая складывает попарно числа...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.