|
Компилятор XScale |
|
|
|
Jun 30 2012, 14:09
|
Частый гость
 
Группа: Свой
Сообщений: 91
Регистрация: 26-01-06
Пользователь №: 13 668

|
Мое почтение, коллеги
На чем сейчас можно писать приложения с возможностью оптимизации под процессоры XScale (с использованием WMMX) для платформы WinCE? Для моих приложений (обработка видео) использование MMX критично. Использую MSVS 2008, у нее, в принципе, есть ключ /Qxscale, но глядя на получающийся ассемблерный листинг, я вижу, что MMX он не использует, в тех местах, где оно просится. Я бы, может, попытался критичные куски вручную наваять, так ассемблера для ARM в ней нет вообще. Поставил, для пробы, MSVS 2010, так там программирование для Smart Devices отсутствует как класс. Как быть?
|
|
|
|
|
 |
Ответов
|
Jul 3 2012, 12:42
|
Частый гость
 
Группа: Участник
Сообщений: 108
Регистрация: 8-09-05
Пользователь №: 8 384

|
Цитата(sz36 @ Jun 30 2012, 18:09)  Мое почтение, коллеги
На чем сейчас можно писать приложения с возможностью оптимизации под процессоры XScale (с использованием WMMX) для платформы WinCE? Для моих приложений (обработка видео) использование MMX критично. Использую MSVS 2008, у нее, в принципе, есть ключ /Qxscale, но глядя на получающийся ассемблерный листинг, я вижу, что MMX он не использует, в тех местах, где оно просится. Я бы, может, попытался критичные куски вручную наваять, так ассемблера для ARM в ней нет вообще. Поставил, для пробы, MSVS 2010, так там программирование для Smart Devices отсутствует как класс. Как быть? ARM ассемблер VS2005 с ключом /Qxscale понимает WMMX инструкции сопроцессора. Могу предположить, что в VS2008 все тоже самое. Не думаю, что С компилятор будет сам использовать сопроцессор, для этого надо самому вызывать MMX intrinsic функции. Может быть еще правильнее пользоваться библиотекой IPP из старых версий, поддерживающих XSсale, ежели такую удастся достать.
|
|
|
|
|
Jul 3 2012, 19:43
|
Частый гость
 
Группа: Свой
Сообщений: 91
Регистрация: 26-01-06
Пользователь №: 13 668

|
Цитата(SBE @ Jul 3 2012, 16:42)  Не думаю, что С компилятор будет сам использовать сопроцессор, для этого надо самому вызывать MMX intrinsic функции. Да, так и есть, я вроде уже разобрался, спасибо. Сейчас пытаюсь вручную критичные куски кода на MMX переписать. Найти бы где-нибудь толковое описание этих intrinsic функций, или примеры использования. А то в MSDN фактически только прототипы, приходится их с описанием машинных команд сопостовлять, муторно.
|
|
|
|
|
Jul 4 2012, 07:01
|
Частый гость
 
Группа: Участник
Сообщений: 108
Регистрация: 8-09-05
Пользователь №: 8 384

|
Цитата(sz36 @ Jul 3 2012, 23:43)  Да, так и есть, я вроде уже разобрался, спасибо. Сейчас пытаюсь вручную критичные куски кода на MMX переписать. Найти бы где-нибудь толковое описание этих intrinsic функций, или примеры использования. А то в MSDN фактически только прототипы, приходится их с описанием машинных команд сопостовлять, муторно. Не использовал, посмотрите в Intel Wireless MMX Technology Developer Guide, там есть описание intrinsic. Попробовал не разбираясь скомпилировать с mmx intrinsic, ругается на выравнивание __m128. Не подскажете, что ему надо? Цитата(Petka @ Jul 3 2012, 21:48)  Одно время рассматривал возможность запуска WinCE на своём изделии (тоже на XScale). Ознакомился с Platform Builder, собрал систему. На тот момент времени функционал получившейся системы оказался неконкурентоспособен. Ок, значит в теме. Только естественно без MMU не работает. ИМХО для наших приложений (industrial, приборостроение) на данный момент в этом классе конкурирует с embedded Lunix, остальное из другой категории. Цитата BSP для WinCE сейчас отсутствует для 90% чипов с MMU. А на чипах без MMU наверняка не работает вообще. С 2006 года никакого развития. Только в 2011 году выпустили новую версию. ИМХО последнюю. Да, развитие замедлилось в последние годы, причем последняя WinCE7 не очень революционная, разве что многоядерность добавили. Только конечно не с 2006, они шестерку активно развивали до 2009. Могут и забросить. Хотя линейку для embedded развивать будут, а значит нужна будет адекватная замена. Не смотрел последние пару лет где какие BSP выходят, может тренд в сторону линокса и есть. Не назовете какие чипы попали в эти 90%? Цитата Есть ли какие-нибудь результаты тестирования? Или это предположение? Частью сам проверял, часть по чужим системам и слухам. Тут, конечно надо уточнить, что под ресурсами понимаем. Объемы памяти под образ и RAM? Если про производительность, то по каким критериям? Время реакции называл и это не предположения. Есть еще потребление, время загрузки и т.д.. Цитата Программисты под win32 тоже скоро станут редкими. Основной трэнд - ява. На этой платформе пишет огромное количество взаимозаменяемых программистов "высокого уровня". И не за дорого. Ну и шарп еще. Тренд действительно туда, насколько это хорошо годится для глубоко встраиваемых систем у меня пока сомнения. Цитата Это и есть жуткое старьё. Делать на "этом" удобный пользовательский интерфейс долго без использования каких - либо тулкитов. А любой вменяемый тулкит может работать практически на любой платформе. Полностью согласен, без обертки не обойтись, c которой в реальности проблемно. Только у кого лучше? На линоксе будет тот же QT, ну может быть чуть более родной, но не ставший от этого не легче, не резвее. QNX прикрутила флеш. Поэтому и говорю, что силверлайт в шестерке должен быть в тему, даже неважно от его судьбы на PC, поскольку нативный для системы. Не делал на нем ничего, может гладко на было на бумаге. Также как и про глубину оврагов для вменяемого тулкита (какого интересно?) на любой платформе. Цитата P.S. Искренне удивлён, как вам удалось связываться сразу с несколькими, которые уже "уходят в мир иной": Про уходящих согласен, оправдывает только что связались лет семь назад, это уже давно прошедшая история. В индустриальных применениях вдолгую приходится работать, пять-десять лет не срок. Цитата 1. XScale - процессорное ядро на текущий момент поддерживаемое только интелом. Вытесняется по всем фронтам процессорами на базе ядер Cortex-A. О чем вы, нету его давно уже у Интела. Он усех кинул и продал мобильную линейку Марвелу, котрый выпустил несколько чипов в развитие. Конечно никуда с мейнстрима Cortex-A никто неуйдет, но это не принципиально, уж тем более для больших осей и управляемого кода. Цитата 2. WinCE - безнадёжно отставшая ОС. Микрософт прекратит её поддержку в пользу "Windows RT". Вот это посмотрим на чем MS будет встроенный рынок удерживать. Повторюсь, что здесь надо вдолгую играть. И не путать ядро для мобильных платформ и для глубоко встраиваемых приложений. Хорошо, чтоб микрософт это тоже не путала Толково это объяснено по ссылке Why Windows Embedded Compact is here to stay..
|
|
|
|
|
Jul 4 2012, 14:06
|
Частый гость
 
Группа: Свой
Сообщений: 91
Регистрация: 26-01-06
Пользователь №: 13 668

|
Мое почтение! Цитата(SBE @ Jul 4 2012, 11:01)  Попробовал не разбираясь скомпилировать с mmx intrinsic, ругается на выравнивание __m128. Не подскажете, что ему надо? А у Вас какая платформа? Как я понимаю, __m128 это SSE2, а его далеко не все платформы поддерживают. У меня __m64, но и с ним засада обнаружилась. Вот, к примеру, такой код Код int Temp[64]; __m64 X; X.m64_i64=0x1122334455667788; __m64 Y; Y.m64_i64=0x8877665544332211; __m64 A=_mm_macz_pi16(X, Y); (!) Temp[0] = A.m64_u32[0]; Temp[1] = A.m64_u32[1]; Посмотрим, во что он компилируется, начиная со строки (!). Релиз, все возможные опции оптимизации выставлены на максимальную скорость, MSVS2008. Код 00040 ed9d1144 wldrw wr1, [sp, #0x110] 00044 ed9d0146 wldrw wr0, [sp, #0x118] 00048 e3a03040 mov r3, #0x40 0004c ee710100 wmacsz wr0, wr1, wr0 00050 ed8d0144 wstrw wr0, [sp, #0x110] ---[b]баг компилятора?[/b] 00054 e59d2114 ldr r2, [sp, #0x114] 00058 e59d0110 ldr r0, [sp, #0x110] 0005c e58d0010 str r0, [sp, #0x10] 00060 e58d2014 str r2, [sp, #0x14] Вопрос - зачем строки 50...60? Почему бы сразу не сохранить в нужное место? А так, получается, на одну MMX команду, где достигается какая-то экономия, аж 5 ненужных пересылок с памятью вместо одной. Я помню, в XX веке компиляторы генерировали подобный код, но сейчас, мне кажется, это уже как-то неприлично, компилятор должен оптимизировать это на раз. Но это даже не главное. А главное - почему команда wstrw, а не wstrd?! Получается, что сохраняются только младшие 32 биты из 64, а в старших битах оказывается мусор. Причем, в данной команде, положим, результат не может выйти за 32 бита, но такой же код генерируется и для всех других функций, в частности, для _mm_unpackel_pu8() и подобных, где уж точно все 64 бита нужны. Везде используется wstrw, только младшие 32 бита. Что это, баг компилятора!? Слабо верится, почему никто не заметил, ведь ни одна MMX функция не работает. Или я чего-то не понимаю? Причем, под Win32 тот же код компилируется и работает правильно, проблема только под ARM.
|
|
|
|
|
Jul 4 2012, 17:56
|
Частый гость
 
Группа: Участник
Сообщений: 108
Регистрация: 8-09-05
Пользователь №: 8 384

|
Цитата(sz36 @ Jul 4 2012, 18:06)  А у Вас какая платформа? Как я понимаю, __m128 это SSE2, а его далеко не все платформы поддерживают. У меня __m64, но и с ним засада обнаружилась. Не разобрался сходу, в Colibri SDK похоже хидер не доложили, поправил. VS2005 генерирует другой код и использует wstrd, не разбирался в корректности. Код ; 74 : int Temp[64]; ; 75 : ; 76 : __m64 X; ; 77 : X.m64_i64=0x1122334455667788; ; 78 : __m64 Y; ; 79 : Y.m64_i64=0x8877665544332211;
00044 e59f10a0 ldr r1, [pc, #0xA0] 00048 e59f0098 ldr r0, [pc, #0x98] 0004c ee203012 tmia wr0, r2, r3 00050 e59f308c ldr r3, [pc, #0x8C] 00054 e59f2084 ldr r2, [pc, #0x84] 00058 e3a04001 mov r4, #1 0005c e58d3000 str r3, [sp] 00060 e58d2004 str r2, [sp, #4]
; 80 : __m64 A=_mm_macz_pi16(X, Y); // (!)
00064 eddd1100 wldrd wr1, [sp] 00068 e3a0e005 mov lr, #5 0006c e58d1008 str r1, [sp, #8] 00070 e58d000c str r0, [sp, #0xC] 00074 eddd0102 wldrd wr0, [sp, #8] 00078 ee28e014 tmiaph wr0, r4, lr 0007c e3a04002 mov r4, #2 00080 e3a0e008 mov lr, #8 00084 ee710100 wmacsz wr0, wr1, wr0 00088 ee2fe014 tmiatt wr0, r4, lr 0008c edcd0102 wstrd wr0, [sp, #8] 00090 ec523000 tmrrc r3, r2, wr0
; 81 : Temp[0] = A.m64_u32[0]; ; 82 : Temp[1] = A.m64_u32[1]; ИМХО при оптимизации лучше помогать компилятору и писать так, чтоб он гадал поменьше. Например, будет ли использоваться дальше временная переменная и т.п.
|
|
|
|
|
Jul 4 2012, 23:05
|
Частый гость
 
Группа: Свой
Сообщений: 91
Регистрация: 26-01-06
Пользователь №: 13 668

|
Цитата(SBE @ Jul 4 2012, 21:56)  Не разобрался сходу, в Colibri SDK похоже хидер не доложили, поправил. Ага, у меня тоже, я из SDK к WINCE 6 взял. Цитата(SBE @ Jul 4 2012, 21:56)  VS2005 генерирует другой код и использует wstrd, не разбирался в корректности. Ну я вообще не понимаю, как так может быть. Пойду VS2005 искать. А ключи типа процессора у Вас какие? У меня ARM5T (/QRarch5t) и /Qxscale. Код, кстати, тоже какой-то мутный, я не такой глубокий знаток ARM, сходу не понимаю, надо под отладчиком посмотреть. Но, во всяком случае, сохраняется 64 бита, это дает надежду. У меня, в Debug сборке, компилер MMX код не генерирует, эмулируя обычными операциями (возможно, это и правильно). Но что интересно, в таком режиме тоже в старших 32 битах возвращаемых Intrinsic функциями значений оказывается мусор, под отладчиком это прекрасно видно. То есть, такое поведение и задумывалось. Вообщем, не понимаю. Пойду VS2005 искать, спасибо, что код проверили Цитата(SBE @ Jul 4 2012, 21:56)  ИМХО при оптимизации лучше помогать компилятору и писать так, чтоб он гадал поменьше. Например, будет ли использоваться дальше временная переменная и т.п. Это я знаю, что помогать надо, но он же должен видеть, что до конца области видимости упоминаний этих переменных нет. Как ему еще указать? Я больше с IAR для AVR работаю, привык уже, что тот, если значение переменной не используется, все операции с ней выбрасывает. Если после этого другая переменная оказывается неиспользуемой, или функция - и их тоже, и т д. Бывает, чисто для отладки нужно переменную вставить, так только volatile static прокатывает. А MSVS, мерзавец, лепит в выходной код все, почем зря.
|
|
|
|
|
Jul 4 2012, 23:41
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(sz36 @ Jul 5 2012, 02:05)  Бывает, чисто для отладки нужно переменную вставить, так только volatile static прокатывает. volatile хватает. Цитата(sz36 @ Jul 5 2012, 02:05)  А MSVS, мерзавец, лепит в выходной код все, почем зря. Может для АРМ и так, а для x86 вряд ли так.
|
|
|
|
Сообщений в этой теме
sz36 Компилятор XScale Jun 30 2012, 14:09 kovigor Цитата(sz36 @ Jun 30 2012, 17:09) Я бы, м... Jun 30 2012, 20:42 sz36 Цитата(kovigor @ Jul 1 2012, 00:42) И асс... Jul 1 2012, 16:12  Petka Цитата(sz36 @ Jul 1 2012, 20:12) ...
В ... Jul 2 2012, 07:29 GDI Мы пишем под XScale и WinCE используя Embedded VC,... Jul 2 2012, 08:58 sz36 Цитата(GDI @ Jul 2 2012, 12:58) Мы пишем ... Jul 2 2012, 14:48  Petka Цитата(sz36 @ Jul 2 2012, 18:48) ...
Н... Jul 2 2012, 15:57   sz36 Цитата(Petka @ Jul 2 2012, 19:57) P.S. Кс... Jul 2 2012, 18:39    Petka Цитата(sz36 @ Jul 2 2012, 22:39) Из того,... Jul 3 2012, 04:25   SBE Цитата(Petka @ Jul 2 2012, 19:57) Зачем а... Jul 3 2012, 15:24    Petka Цитата(SBE @ Jul 3 2012, 19:24) Не знаю н... Jul 3 2012, 17:48   Petka Цитата(SBE @ Jul 4 2012, 11:01) ....
Не ... Jul 4 2012, 10:19    SBE Цитата(Petka @ Jul 4 2012, 14:19) Все про... Jul 4 2012, 14:27      SBE Цитата(sz36 @ Jul 5 2012, 03:05) А ключи ... Jul 5 2012, 14:08
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|