Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: C64x выполнение инструкций
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Warlord
Всем привет!
Пишу следующие 2 команды
Код
     OR.D1      0,A4,A3
     MPY.M1X   A3,B8,A12
||   MPY.M2X   B8,A3,B12

процессор выполняет эти 2 команды за 3 такта, хотя по логике должен за 2. Если закоментить первую, оставшуюся выполнит за один такт, если поменять в первой A3 на другой, например OR.D1 0,A4, A7, камень исполняет за 2 такта. Где шаманство?
Warlord
Нашел, пришлось внимательно читать мануалы:
On the C64x, a delay clock cycle is introduced whenever an instruction
attempts to read a source register via a cross path where that register was
updated in the previous cycle. This is known as a cross path stall. This stall is
inserted automatically by the hardware; no NOP instruction is needed. This cross path
stall is necessary so that the C64x can achieve clock rate goals beyond 1GHz.
Shamil.Ru
Цитата(Warlord @ Sep 1 2006, 17:57) *
Нашел, пришлось внимательно читать мануалы:
On the C64x, a delay clock cycle is introduced whenever an instruction
attempts to read a source register via a cross path where that register was
updated in the previous cycle. This is known as a cross path stall. This stall is
inserted automatically by the hardware; no NOP instruction is needed. This cross path
stall is necessary so that the C64x can achieve clock rate goals beyond 1GHz.

Кросс-пути -- это вообще такая нетривиальная вещь, из-за которой на 64-х малоцелесообразно писать на ассемблере. Потому что человек не может держать в голове все эти банки регистров, 8 вычислителей, кто с кем вступает в конфликт. Там в документации есть такие конструкции, когда можно учесть такты и даже сделать последовательные вычисления в параллельных инструкциях. Имхо, это такое исскуство, что ему надо учиться годами, а потом с появлением нового камня снова переучиваться smile.gif

Отсюда мое личное имхо -- на 6000-никах только Си (и Си++)!
bav
Да, писать на ассемблере утомительно. Но, помнить все переменные не обязательно. Для этого составляется граф, затем программа. Но, соглашусь, зачем это делать вручную. Нужно только грамотно написать код на Си(++).
А на 6000 шаманства очень много, и не только на ассемблере.
Совет, пока не наступили на грабли, пользуйтесь всем, что предлагает производитель (компилятор Си/Си++, библиотеки, примеры,...), не надо придумывать своего (кроме алгоритма обработки), пользуйтесь готовым.
Я месяц ходил по граблям, конфигурируя периферию вручную, код получился не лучше и не меньше, только потерял много времени.
Warlord
На ассемблере пишу только потому что нужно выжать из камня максимум(реализую алгоритм), учитываю каждый такт, компилятор с опцией -O3 очень сильная вещь, но мне удается обойти его и по компактности кода и, что самое важное, по быстродействию. Еще приметил одну особенность: Пишу функцию на ассембреле, на мнемонике, а вызывающий код - сишный, так вот вызываю свою ф-ю в цикле. Отрабатывает первый раз и глохнет, смотрю ассемблер, в функцию передается переменная таким образом:
Код
           B.S1   MyFunс
           ADDKPC.S2  RL1,B3,4
           OR.L1    0,A10,A4

т.е. он переменную для функции загоняет сначала в А10 перед циклом, а потом в цикле перед вызовом функции передает в регистре А4. Так вот, в функции я использую регистр А10, соответственно значение переменной затирается и уже при втором вызове функции передается неправильное значение. Как узнать, какие регистры свободные на момент вызова функции, а какие несут полезную информацию? На ПК было все просто, сохранил все хозяйство в стек, отработал, восстановил и порядок, а здесь?
bav
А здесь можно тоже, сохранить регистры в стеке. Что-то типа:
STNDW A1:A0, *SP--
STNDW A3:A2, *SP--
и восстановить:
LDNDW *++SP, A3:A2
LDNDW *++SP, A1:A0

еще можно указать, какие регистры используются в Вашей функции, чтобы компилятор сохранял значение в стеке или не использовал бы этот регистр.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.