asm вставки в C++ (mingw) для работы с FPU
От: shvellerr Россия  
Дата: 07.08.12 09:47
Оценка:
Доброго времени суток
Пишу небольшой проектик на с++ (в учебных целях)понадобились быстрые вычисления. Пробовал разобраться с FPU (с ассемблером почти не знаком) нашел некоторую информацию в интернете вроде бы не очень сложно только проблема в том что все учебники используют интеловский синтаксис а я использую code::blocks с mingw который в свою очередь использует ассемблер в синтаксисе AT&T похожий в Linuxe кажется... а он сложней и литературы (тем более по FPU) на русском языке не нашел английский я не понимать. Пробовал примеры "переводить" из интеловской нотациии в АТТ поулчается плохо одни ошибки. Кое что интересное в Викиучебнике "Ассемблер в Linux для программистов C" но про FPU ничего нет. Пожалуйста подскажите как мне быть может есть какая литература или другой способ решения этой интересной задачи
Re: asm вставки в C++ (mingw) для работы с FPU
От: angry.andrew Украина  
Дата: 07.08.12 10:07
Оценка: +1
Если цель — решить задачу, а не изучить ассемблер, то лучше откажитесь от асма. Помимио очевидных недостатков асма по сравнению с С++, маловероятно, что вам удастся написать заметно более быстрый код с использованием FPU, чем это получится у оптимизирующего компилятора (а без опыта скорее всего выйдет так же или медленнее). Это со всякими SSE можно играться и на определенных задачах типа линейной алгебры получать существенный выигрыш.

Здравствуйте, shvellerr, Вы писали:

S>Доброго времени суток

S>Пишу небольшой проектик на с++ (в учебных целях)понадобились быстрые вычисления. Пробовал разобраться с FPU (с ассемблером почти не знаком) нашел некоторую информацию в интернете вроде бы не очень сложно только проблема в том что все учебники используют интеловский синтаксис а я использую code::blocks с mingw который в свою очередь использует ассемблер в синтаксисе AT&T похожий в Linuxe кажется... а он сложней и литературы (тем более по FPU) на русском языке не нашел английский я не понимать. Пробовал примеры "переводить" из интеловской нотациии в АТТ поулчается плохо одни ошибки. Кое что интересное в Викиучебнике "Ассемблер в Linux для программистов C" но про FPU ничего нет. Пожалуйста подскажите как мне быть может есть какая литература или другой способ решения этой интересной задачи
Re: asm вставки в C++ (mingw) для работы с FPU
От: watch-maker  
Дата: 07.08.12 10:11
Оценка: 7 (1) +2
Здравствуйте, shvellerr, Вы писали:

S>Пишу небольшой проектик на с++ (в учебных целях)понадобились быстрые вычисления. Пробовал разобраться с FPU (с ассемблером почти не знаком)

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

Тем более, что если тебе нужна быстрая математика с вещественными числами, то тебе нужно смотреть не на FPU, а на SSE. Во многих компиляторах для x86 уже есть всё необходимое для работы:
#include <xmmintrin.h> // SSE
#include <emmintrin.h> // SSE2
#include <pmmintrin.h> // SSE3
// и так далее
Интринсики, которые определены в этих заголовочных файлах, как раз и помогут тебе в быстрых вычислениях. Да и пользоваться ими намного удобнее, чем писать на ассемблере.

Плюс, конечно, стоит рассмотреть возможность использования ещё более высокоуровнывых библиотек (типа ACML или IntelIPP) для расчётов.

S>нашел некоторую информацию в интернете вроде бы не очень сложно только проблема в том что все учебники используют интеловский синтаксис а я использую code::blocks с mingw который в свою очередь использует ассемблер в синтаксисе AT&T похожий в Linuxe кажется... а он сложней и литературы (тем более по FPU) на русском языке не нашел английский я не понимать. Пробовал примеры "переводить" из интеловской нотациии в АТТ поулчается плохо одни ошибки. Кое что интересное в Викиучебнике "Ассемблер в Linux для программистов C" но про FPU ничего нет. Пожалуйста подскажите как мне быть может есть какая литература или другой способ решения этой интересной задачи :)

Учить язык.
Посмотреть примеры в документации: http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html http://gcc.gnu.org/onlinedocs/gcc/Constraints.html
Посмотреть на то, как сам компилятор преобразует C код в ассемблер (используй ключ -S при вызове компилятора).
Но мне кажется, что всё это тебе пока не нужно. Интринсики и библиотеки — куда более перспективный путь.
Re: asm вставки в C++ (mingw) для работы с FPU
От: Erop Россия  
Дата: 07.08.12 16:17
Оценка: 7 (1)
Здравствуйте, shvellerr, Вы писали:

S>Пишу небольшой проектик на с++ (в учебных целях)понадобились быстрые вычисления.


1) Если хочешь научиться быстрым вычислениям, то учишься писать на ВЫСОКОУРОВНЕВЫХ языках, и использовать библиотеки, всякие средства распараллеливания, ВЫСОКОУРОВНЕВЫЕ тоже ну и интрисики стоит заботать. Но главное тут не это, а алгоритмы и структуры данных. Тема оптимизации вычислений уже очень хорошо проработана, так что если ты сможешь выбрать такиен структуры данных и алгоритмы, что они хорошо лягут на архитектуру (ну, типа, загрузят все ядра GPU, например, или все ядра/головы компика и никто нигде не будет ждать, пока какие-то данные куда-то прокачаются или там на синхронизациях и т. п.), то всё будет уже быстро.

2) Ботаешь хороший профайлер, типа интеловского. И с ним смотришь чего насколько быстро. Ну и прямые замеры производительности системы под реальной стрессовой нагрузкой рулят.

3) Если таки хочешь научиться, не быстро считать, а асму, то пишешь нужные функции на макроасме и просто включаешь в проект. За одно с Сишными соглашениеями об именованиях и вызовах разберёшься + конструкцию extern "C" освоишь...

4) А вот если тебе для повышения быстродействия хочется замутить свой JIT-компилятор (типа какие-то данные трансформируются в код, после чего этот код прожёвывает другие данные), то вот тогда asm вставки рулят, и то не всегда...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: asm вставки в C++ (mingw) для работы с FPU
От: shvellerr Россия  
Дата: 11.08.12 19:10
Оценка:
Здравствуйте, Erop, Вы писали:

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


Написание inline asm вставок в gcc
Ассемблерная вставка в с++ код, подобна использованию шаблона с аргументами
asm | __asm__ ("тело шаблона" [: [b]output operands] [: [b]input operands [/b][: [clobber]]]] ]);[/b]тело шаблона это одна или несколько ассемблерных команд

или (из другого источника)
asm("code" : "output" : "input": "registers");

если команды в теле шаблона должны использовать переменные или регистры из c окружения, то в теле шаблона нужно использовать операнды вида %0,%1, ... все операнды должны быть проинициализированы или в output operands или в input operands или и там и там инициализируются они через запятую

Пример: (чужой и мне не очень понятный)

static __inline__ void
powerpmc250_set_bat(void)
{
        unsigned long   bat3u, bat3l;
        static int        mapping_set = 0;

        if (!mapping_set)
        {
                __asm__ __volatile__(
                                " lis %0,0xf000\n \
                                ori %1,%0,0x002a\n \
                                ori %0,%0,0x1ffe\n \
                                mtspr 0x21e,%0\n \
                                mtspr 0x21f,%1\n \
                                isync\n \
                                sync "
                                : "=r" (bat3u), "=r" (bat3l));
                mapping_set = 1;
        }
        return;
}


в этом примере используются два операнда %0 и %1 и их значения должны быть переданы в локальные переменные bat3u и bat3l соответственно.
порядок записи : "=r" (bat3u), "=r" (bat3l) соответствует порядку нумерации операндов
тоесть "=r" (bat3u) соответствует 0 операнду, а "=r" (bat3l) — первому.
з.ы. из за специфической инициализации немогу найти "новый" синтаксис некоторых команд.. (особенно для FPU)
Re[3]: asm вставки в C++ (mingw) для работы с FPU
От: watch-maker  
Дата: 12.08.12 14:50
Оценка: +1
Здравствуйте, shvellerr, Вы писали:

S>Пример: (чужой и мне не очень понятный)

Это же пример для PPC. Зачем он тебе?


S>з.ы. из за специфической инициализации немогу найти "новый" синтаксис некоторых команд.. (особенно для FPU)

Какой ещё инициализации? Имена инструкций можно посмотреть в документации. А можно просто посмотреть как их называет компилятор (воспользуйся уже ключом -S).

А вообще, если не хочется одновременно учить ассемблер и особенности устройства ассемблерных вставок, то лучше взять нормальный ассемблер (YASM, NASM, любой другой, который описан в твоём учебнике), и писать свои программы на ассемблере (используя тот синтаксис, который описан в твоём учебнике). А уже полученные из ассемблерных исходников объектные файлы передавать компилятору — он сам разберётся что с ними нужно сделать.
Re: asm вставки в C++ (mingw) для работы с FPU
От: jazzer Россия Skype: enerjazzer
Дата: 16.08.12 03:38
Оценка: +1
Здравствуйте, shvellerr, Вы писали:

S>Пишу небольшой проектик на с++ (в учебных целях)понадобились быстрые вычисления.


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

Ищи интринсики компилятора (в твоем случае — SSE и прочая, смотри интелловские доки), соответствующие тому асму, который ты собираешься написать, и юзай их — с ними у оптимизатора не будет проблем.

Ну и смотри дизасмом, что компилятор тебе нагенерил, ессно.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.