реклама на сайте
подробности

 
 
> Компилятор XScale
sz36
сообщение Jun 30 2012, 14:09
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 91
Регистрация: 26-01-06
Пользователь №: 13 668



Мое почтение, коллеги

На чем сейчас можно писать приложения с возможностью оптимизации под процессоры XScale (с использованием WMMX) для платформы WinCE? Для моих приложений (обработка видео) использование MMX критично. Использую MSVS 2008, у нее, в принципе, есть ключ /Qxscale, но глядя на получающийся ассемблерный листинг, я вижу, что MMX он не использует, в тех местах, где оно просится. Я бы, может, попытался критичные куски вручную наваять, так ассемблера для ARM в ней нет вообще.
Поставил, для пробы, MSVS 2010, так там программирование для Smart Devices отсутствует как класс. Как быть?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SBE
сообщение Jul 3 2012, 12:42
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 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, ежели такую удастся достать.


Go to the top of the page
 
+Quote Post
sz36
сообщение Jul 3 2012, 19:43
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 91
Регистрация: 26-01-06
Пользователь №: 13 668



Цитата(SBE @ Jul 3 2012, 16:42) *
Не думаю, что С компилятор будет сам использовать сопроцессор, для этого надо самому вызывать MMX intrinsic функции.


Да, так и есть, я вроде уже разобрался, спасибо. Сейчас пытаюсь вручную критичные куски кода на MMX переписать. Найти бы где-нибудь толковое описание этих intrinsic функций, или примеры использования. А то в MSDN фактически только прототипы, приходится их с описанием машинных команд сопостовлять, муторно.
Go to the top of the page
 
+Quote Post
SBE
сообщение Jul 4 2012, 07:01
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 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 будет встроенный рынок удерживать. Повторюсь, что здесь надо вдолгую играть. И не путать ядро для мобильных платформ и для глубоко встраиваемых приложений. Хорошо, чтоб микрософт это тоже не путалаsm.gif
Толково это объяснено по ссылкеWhy Windows Embedded Compact is here to stay..


Go to the top of the page
 
+Quote Post
sz36
сообщение Jul 4 2012, 14:06
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 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.


Go to the top of the page
 
+Quote Post
SBE
сообщение Jul 4 2012, 17:56
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 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];

ИМХО при оптимизации лучше помогать компилятору и писать так, чтоб он гадал поменьше. Например, будет ли использоваться дальше временная переменная и т.п.
Go to the top of the page
 
+Quote Post
sz36
сообщение Jul 4 2012, 23:05
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 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, мерзавец, лепит в выходной код все, почем зря.


Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 4 2012, 23:41
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(sz36 @ Jul 5 2012, 02:05) *
Бывает, чисто для отладки нужно переменную вставить, так только volatile static прокатывает.

volatile хватает.

Цитата(sz36 @ Jul 5 2012, 02:05) *
А MSVS, мерзавец, лепит в выходной код все, почем зря.

Может для АРМ и так, а для x86 вряд ли так.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 22:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01498 секунд с 7
ELECTRONIX ©2004-2016