|
|
  |
C64x выполнение инструкций, шаманство камня |
|
|
|
Sep 1 2006, 12:08
|
Частый гость
 
Группа: Свой
Сообщений: 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 такта. Где шаманство?
|
|
|
|
|
Sep 1 2006, 14:36
|
Участник

Группа: Новичок
Сообщений: 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 вычислителей, кто с кем вступает в конфликт. Там в документации есть такие конструкции, когда можно учесть такты и даже сделать последовательные вычисления в параллельных инструкциях. Имхо, это такое исскуство, что ему надо учиться годами, а потом с появлением нового камня снова переучиваться  Отсюда мое личное имхо -- на 6000-никах только Си (и Си++)!
|
|
|
|
|
Sep 4 2006, 10:33
|
Знающий
   
Группа: Свой
Сообщений: 693
Регистрация: 21-06-05
Из: Санкт-Петербург
Пользователь №: 6 184

|
Да, писать на ассемблере утомительно. Но, помнить все переменные не обязательно. Для этого составляется граф, затем программа. Но, соглашусь, зачем это делать вручную. Нужно только грамотно написать код на Си(++). А на 6000 шаманства очень много, и не только на ассемблере. Совет, пока не наступили на грабли, пользуйтесь всем, что предлагает производитель (компилятор Си/Си++, библиотеки, примеры,...), не надо придумывать своего (кроме алгоритма обработки), пользуйтесь готовым. Я месяц ходил по граблям, конфигурируя периферию вручную, код получился не лучше и не меньше, только потерял много времени.
|
|
|
|
|
Sep 5 2006, 05:52
|
Частый гость
 
Группа: Свой
Сообщений: 121
Регистрация: 23-09-05
Из: Москва
Пользователь №: 8 874

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