Многоядерные процессоры с низким энергопотреблением
Распараллелив вычисления на 4-м этапе скорость преобразования можно еще несколько поднять.
Наиболее загруженное по коду ядро - ядро номер 16:
Код:
RAM Node 16 : d*-shift 000 31JS 134CA call CA * 001 NNR8 3A28F drop drop a@ @p+ 002 QLAK 20000 003 MIIS 387C2 xor 2/ 2/ . 004 IIIS 307C2 2/ 2/ 2/ . 005 III0 307C5 2/ 2/ 2/ ; 006 J8SK 33DB0 not @p+ . + 007 ALAG 00001 008 0000 15555 ; : negate 009 J8SK 33DB0 not @p+ . + 00A ALAG 00001 00B 0000 15555 ; : +bat 00C AQFS 00F2A @b over !a . 00D K000 3D555 + ; : -bat 00E OF3G 25A49 dup !a call 9 negate 00F ASK0 009F5 @b . + ; 010 88US 05DA2 @p+ @p+ b! . 011 AK40 00175 012 AKG0 001D5 013 VAFS 2BF2A a! @b !a . 014 AAFS 01F2A @b @b !a . 015 AFAS 01A02 @b !a @b . 016 FAF8 0BF2F !a @b !a @p+ 017 AK20 00145 018 OVUS 24AA2 dup a! b! . 019 31BC 1340E call E -bat 01A 8OVS 04DAA @p+ dup a! . 01B AK40 00175 01C U3B4 2960C b! call C +bat 01D O8VS 25DAA dup @p+ a! . 01E AKG0 001D5 01F FAFO 0BF2B !a @b !a dup 020 FAFO 0BF2B !a @b !a dup 021 ARTS 00EBA @b a@ push . 022 K8SS 3DDB2 + @p+ . . 023 ALS0 000B5 024 31AK 13400 call 0 d*-shift 025 31BG 13409 call 9 negate 026 OOMO 24DE3 dup dup xor dup 027 SKNS 2C1EA . + drop . 028 PVBS 26A0A pop a! @a . 029 KQES 3CF22 + over !b . 02A BE88 03B17 @a !b @p+ @p+ 02B AKG0 001D5 02C AK40 00175 02D UVAS 28A02 b! a! @b . 02E FAFS 0BF2A !a @b !a . 02F RTAO 22803 a@ push @b dup 030 F8SS 0BDB2 !a @p+ . . 031 ALN0 000ED 032 31AK 13400 call 0 d*-shift 033 PVAO 26A03 pop a! @b dup 034 F8SS 0BDB2 !a @p+ . . 035 AL6S 00062 036 31AK 13400 call 0 d*-shift 037 31BG 13409 call 9 negate 038 KQQS 3CF82 + over over . 039 31BG 13409 call 9 negate 03A KTSK 3C8B0 + push . + 03B PS8S 26912 pop . @p+ . 03C AK80 00115 03D UAAK 29F00 b! @b @b + 03E 31VG 03F 31VG
В среднем, загрузка RAM задействованных ядер порядка 70-80%.
Некоторые интересные программные трюки [20]
Счетчик единичных бит в слове:
: bc0 ( n -- c ) dup dup xor . : bc1 ( n c' -- c ) not push . . : bc2 ( n r:c' -- c ) begin dup push zif \ 'zif' is just forwar next' to 'then' below drop pop not ; then pop and next
C = (A + B) / 2, A,B,C вектора
2 base ! 011111011111011111 constant mask \ 6:6:6 mask, \ use 011111110111101111 for 8:5:5, etc hex : average ( a b -- c ) over over and . push xor 2/ mask # and pop . + ; \ <6 ripple
B = F(A) : A = Ah.Al -> B = Fh[Ah] + Al*Fl[Ah] : interpolate ( a - a' b ) dup 2/ 2/ . 2/ 2/ a! $0F and 2* 2* . 2* 2* @a +* +* +* +* ;
: bit-rotate ( a n -- b ) \ b is a's n left cycle rotation push . . . : Loop not -if not 2* [ ' Loop ] next ; then 2* not [ ' Loop ] next ;
Генератор псевдослучайных чисел
: rnd ( r -- r' ) -if 2* $2cd81 xor ; then 2* ; : poll ( _ ) @b $200 # and if \ Is write request set? '___u # b! \ "Up" neighbor port to B @b push ;: \ call in B to R; execute it. 'iocs # b! then \ Restore IOCS address to B drop ; \ Discard 'if's' argument & return
КИХ фильтр на одном ядре:
: fir-kernel 4 # taps: a0 , 0 , a1 , 0 , a2 , 0 , a3 , 0 , a4 , 0 , : fir ( B:in __ out ) dup dup xor @b fir-kernel drop ;
КИХ фильтр, задействующий несколько ядер:
: long_fir_start dup dup xor @b fir_kernel !b !b ; : long_fir_mid @b push @b pop fir_kernel !b !b ; : long_fir_end @b push @b pop fir_kernel drop ;
БИХ фильтр
: lp.15.2p 4 # taps: $4038 , 0 , $8070 , 0 , $4038 , here 0 , $19D39 , 0 , $361E7 , 0 , ( here ) , : iir ( n _ n') push dup dup xor pop lp.15.2p drop dup !a ;
Вычисляемый переход:
: switch ( case -- ) pop + push ; Пример: @b switch handle0 -; handle1 -; handle2 -; handle3 -; \ table of jump opcodes : switch2 ( case -- ) pop + a! @a push ; Пример: @b switch2 handle0 handle1 handle2 handle3 \ table of addresses (call opcode ignored)
Краткие итоги
AsAP-II и SEAforth40 отличаются от остальных многоядерных процессоров отсутствием кэш-памяти, весьма скромными аппаратными ресурсами и небольшим количеством команд. При этом эти процессоры демонстрируют весьма эффективные системы управления энергопотреблением, обмена данными между ядрами процессора и синхронизации задач, выполняющихся на различных ядрах.
AsAP-II представляет собой систему из 164 однотипных RISC-ядер гарвардской архитектуры с тремя специализированными сопроцессорами, соединенных статически конфигурируемыми коммутаторами. При этом каждое ядро имеет независимый локальный тактовый генератор и контроллер напряжения питания.
Процессор SEAforth40 состоит из 40 фон-неймановских стековых процессорных ядер, объединенных в решетку 4х10. Ядра имеют возможность передачи данных только между своми ближайшими соседями. Ядро, ожидающее приема или завершения передачи данных соседнему ядру, автоматически переходит в спящий режим.
Более всего процессор подходит для потоковой обработки данных в реальном времени. Если вести речь об обработке сигналов - наиболее подходят сигналы звукового диапазона, хотя возможна обработка в реальном времени и сигналов с частотами до нескольких мегагерц. Ключевым фактором для данного процессора является то, что ассемблер процессора является одновременно и языком среднего уровня – представляет собой вариацию языка Форт. Это позволяет разрабатывать приложения для него, максимально оптимизируя их по размеру и быстродействию.
Контрольные вопросы
- Архитектура процессора AsAP — основные принципы построения, общие черты.
- Каким образом организованы связи между ядрами в AsAP-II?
- Как реализовано управления энергопотреблением в 167-ядерном вычислительном массиве AsAP-II?
- В чем состоят основные архитектурные особенности процессорных ядер С18, составляющих SEAforth40?
- Какие регистры входят в состав процессорного ядра С18?
- Как реализуется процедура умножения в процессоре SEAforth40?
- Как реализован обмен с внешними устройствами в процессорах SEAforth40?
Упражнения
- Оцените эффективность схем управления энергопотреблением процессоров AsAP и SEAforth40.
- Оцените эффективность передачи данных между ядрами в процессорах AsAP и SEAforth40.
- На основе примера преобразования Хартли реализуйте шестнадцатиточечное преобразование Уолша с одинарной точностью.
- Модифицируйте пример с фильтром Чебышева таким образом, чтобы его расчет проходил на двух ядрах процессора.
- Оцените время расчета фильтров Чебышева на одном и двух ядрах.