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

 
 
 
Reply to this topicStart new topic
> C64x выполнение инструкций, шаманство камня
Warlord
сообщение Sep 1 2006, 12:08
Сообщение #1


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

Группа: Свой
Сообщений: 121
Регистрация: 23-09-05
Из: Москва
Пользователь №: 8 874



Всем привет!
Пишу следующие 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 такта. Где шаманство?
Go to the top of the page
 
+Quote Post
Warlord
сообщение Sep 1 2006, 13:57
Сообщение #2


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

Группа: Свой
Сообщений: 121
Регистрация: 23-09-05
Из: Москва
Пользователь №: 8 874



Нашел, пришлось внимательно читать мануалы:
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.
Go to the top of the page
 
+Quote Post
Shamil.Ru
сообщение Sep 1 2006, 14:36
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 15
Регистрация: 28-08-06
Из: msk.ru.earth
Пользователь №: 19 894



Цитата(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-никах только Си (и Си++)!
Go to the top of the page
 
+Quote Post
bav
сообщение Sep 4 2006, 10:33
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 693
Регистрация: 21-06-05
Из: Санкт-Петербург
Пользователь №: 6 184



Да, писать на ассемблере утомительно. Но, помнить все переменные не обязательно. Для этого составляется граф, затем программа. Но, соглашусь, зачем это делать вручную. Нужно только грамотно написать код на Си(++).
А на 6000 шаманства очень много, и не только на ассемблере.
Совет, пока не наступили на грабли, пользуйтесь всем, что предлагает производитель (компилятор Си/Си++, библиотеки, примеры,...), не надо придумывать своего (кроме алгоритма обработки), пользуйтесь готовым.
Я месяц ходил по граблям, конфигурируя периферию вручную, код получился не лучше и не меньше, только потерял много времени.
Go to the top of the page
 
+Quote Post
Warlord
сообщение Sep 5 2006, 05:52
Сообщение #5


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

Группа: Свой
Сообщений: 121
Регистрация: 23-09-05
Из: Москва
Пользователь №: 8 874



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

т.е. он переменную для функции загоняет сначала в А10 перед циклом, а потом в цикле перед вызовом функции передает в регистре А4. Так вот, в функции я использую регистр А10, соответственно значение переменной затирается и уже при втором вызове функции передается неправильное значение. Как узнать, какие регистры свободные на момент вызова функции, а какие несут полезную информацию? На ПК было все просто, сохранил все хозяйство в стек, отработал, восстановил и порядок, а здесь?
Go to the top of the page
 
+Quote Post
bav
сообщение Sep 5 2006, 06:38
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 693
Регистрация: 21-06-05
Из: Санкт-Петербург
Пользователь №: 6 184



А здесь можно тоже, сохранить регистры в стеке. Что-то типа:
STNDW A1:A0, *SP--
STNDW A3:A2, *SP--
и восстановить:
LDNDW *++SP, A3:A2
LDNDW *++SP, A1:A0

еще можно указать, какие регистры используются в Вашей функции, чтобы компилятор сохранял значение в стеке или не использовал бы этот регистр.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 07:30
Рейтинг@Mail.ru


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