Sauris 0 16 июля, 2012 Опубликовано 16 июля, 2012 (изменено) · Жалоба И до двух ужимается... // y[0] = _spint(t13); //use intrinsic to convert the number to integer // y[1] = _spint(t12); // y[2] = _spint(t11); // y[3] = _spint(t10); _amemd8(y) = _itod(_spint(t13),_spint(t12)); _amemd8(y+2) = _itod(_spint(t11),_spint(t10)); y += 4; сорри, если попутал порядок этих t, кто там старший, кто младший. По ходу глюк компилятора, что _nassert в части "y" не влияет на STNDW->STDW. А первопричиной неужатия было то, что non-aligned LDNDW/STNDW нельзя параллелить, только одно non-aligned обращение допустимо в одном фетч-пакете. _nassert((int)x % 8 == 0 ); поменял LDNDW на LDDW, а вот для STNDW->STDW пришлось тяжелую артиллерию применить. таким образом _DSPF_fltoq31: ;** --------------------------------------------------------------------------* ; EXCLUSIVE CPU CYCLES: 8 MV .L1 A6,A3 ; |4| NOP 1 MV .L2X A3,B18 ; |4| SHR .S2 B18,2,B5 ; |15| MVC .S2 B5,ILC MV .L2X A4,B5 ; |4| ADDAW .D2 B5,B18,B5 SUB .D2 B5,16,B5 ;*----------------------------------------------------------------------------* ;* SOFTWARE PIPELINE INFORMATION ;* ;* Loop found in file : ../test.c ;* Loop source line : 15 ;* Loop opening brace source line : 15 ;* Loop closing brace source line : 31 ;* Known Minimum Trip Count : 1 ;* Known Max Trip Count Factor : 1 ;* Loop Carried Dependency Bound(^) : 0 ;* Unpartitioned Resource Bound : 2 ;* Partitioned Resource Bound(*) : 2 ;* Resource Partition: ;* A-side B-side ;* .L units 2* 2* ;* .S units 0 0 ;* .D units 2* 2* ;* .M units 2* 2* ;* .X cross paths 0 2* ;* .T address paths 2* 2* ;* Long read paths 0 0 ;* Long write paths 0 0 ;* Logical ops (.LS) 0 0 (.L or .S unit) ;* Addition ops (.LSD) 0 0 (.L or .S or .D unit) ;* Bound(.L .S .LS) 1 1 ;* Bound(.L .S .D .LS .LSD) 2* 2* ;* ;* Searching for software pipeline schedule at ... ;* ii = 2 Schedule found with 8 iterations in parallel ;* ;* Register Usage Table: ;* +-----------------------------------------------------------------+ ;* |AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB| ;* |00000000001111111111222222222233|00000000001111111111222222222233| ;* |01234567890123456789012345678901|01234567890123456789012345678901| ;* |--------------------------------+--------------------------------| ;* 0: | ****** * | ****** | ;* 1: | ******* ** | ****** ** | ;* +-----------------------------------------------------------------+ ;* ;* Done ;* ;* Loop will be splooped ;* Collapsed epilog stages : 0 ;* Collapsed prolog stages : 0 ;* Minimum required memory pad : 0 bytes ;* ;* Minimum safe trip count : 1 ;* Min. prof. trip count (est.) : 2 ;* ;* Mem bank conflicts/iter(est.) : { min 0.000, est 0.000, max 0.000 } ;* Mem bank perf. penalty (est.) : 0.0% ;* ;* ;* Total cycles (est.) : 14 + trip_cnt * 2 ;*----------------------------------------------------------------------------* ;* SETUP CODE ;* ;* MV B4,A6 ;* ADD 8,A6,A6 ;* MV B5,A3 ;* ADD 8,B5,B5 ;* ;* SINGLE SCHEDULED ITERATION ;* ;* $C$C21: ;* 0 LDDW .D2T2 *B5--(16),B9:B8 ; |28| ;* || LDDW .D1T1 *A3--(16),A9:A8 ; |29| ;* 1 NOP 4 ;* 5 MPYSP .M2X A17,B9,B16 ; |28| ;* || MV .S1 A9,A7 ; |29| Split a long life ;* 6 MPYSP .M2X A17,B8,B9 ; |28| ;* || MPYSP .M1 A17,A8,A5 ; |29| ;* 7 MPYSP .M1 A17,A7,A16 ; |29| ;* 8 NOP 1 ;* 9 SPINT .L2 B16,B17 ; |28| ;* 10 SPINT .L2 B9,B6 ; |28| ;* || SPINT .L1 A5,A4 ; |29| ;* 11 SPINT .L1 A16,A5 ; |29| ;* 12 NOP 1 ;* 13 MV .S2 B17,B7 ; |28| Split a long life ;* 14 NOP 1 ;* 15 STDW .D2T2 B7:B6,*B4++(16) ; |28| ;* || STDW .D1T1 A5:A4,*A6++(16) ; |29| ;* || SPBR $C$C21 ;* 16 ; BRANCHCC OCCURS {$C$C21} ; |15| ;*----------------------------------------------------------------------------* $C$L1: ; PIPED LOOP PROLOG ; EXCLUSIVE CPU CYCLES: 15 SPLOOP 2 ;16 ; (P) || ADD .L2 8,B5,B5 || MV .L1X B5,A3 ;** --------------------------------------------------------------------------* $C$L2: ; PIPED LOOP KERNEL ; EXCLUSIVE CPU CYCLES: 2 LDDW .D1T1 *A3--(16),A9:A8 ; |29| (P) <0,0> || LDDW .D2T2 *B5--(16),B9:B8 ; |28| (P) <0,0> NOP 1 SPMASK L1,S1 || ZERO .L1 A17 || MV .S1X B4,A6 ; |4| SPMASK S1 || MVKH .S1 0x4f000000,A17 SPMASK L2 || MV .L2X A6,B4 MV .S1 A9,A7 ; |29| (P) <0,5> Split a long life || MPYSP .M2X A17,B9,B16 ; |28| (P) <0,5> MPYSP .M2X A17,B8,B9 ; |28| (P) <0,6> || MPYSP .M1 A17,A8,A5 ; |29| (P) <0,6> MPYSP .M1 A17,A7,A16 ; |29| (P) <0,7> NOP 1 SPINT .L2 B16,B17 ; |28| (P) <0,9> SPINT .L2 B9,B6 ; |28| (P) <0,10> || SPINT .L1 A5,A4 ; |29| (P) <0,10> SPINT .L1 A16,A5 ; |29| (P) <0,11> NOP 1 SPMASK D1 || ADD .D1 8,A6,A6 || MV .S2 B17,B7 ; |28| (P) <0,13> Split a long life NOP 1 SPKERNEL 4,0 || STDW .D2T2 B7:B6,*B4++(16) ; |28| <0,15> || STDW .D1T1 A5:A4,*A6++(16) ; |29| <0,15> ;** --------------------------------------------------------------------------* $C$L3: ; PIPED LOOP EPILOG ; EXCLUSIVE CPU CYCLES: 14 RETNOP .S2 B3,5 ; |33| ; BRANCH OCCURS {B3} ; |33| из void DSPF_fltoq31(float* restrict x, int * restrict y, int n) { int fadcr_store; float t00, t01, t02, t03, t10, t11, t12, t13; long long t; _nassert(n > 0); _nassert(n % 4 == 0); _nassert((int)y % 8 == 0 ); _nassert((int)x % 8 == 0 ); #pragma MUST_ITERATE(1,,) while ((n -= 4) >= 0) { t00 = x[n + 0]; t01 = x[n + 1]; t02 = x[n + 2]; t03 = x[n + 3]; t10 = t00 * 0x80000000; //multiply by 2^23 for converting to Q23 format (this brings the number in the range -0x800000 to 0x800000) t11 = t01 * 0x80000000; t12 = t02 * 0x80000000; t13 = t03 * 0x80000000; // y[0] = _spint(t13); //use intrinsic to convert the number to integer // y[1] = _spint(t12); // y[2] = _spint(t11); // y[3] = _spint(t10); _amemd8(y) = _itod(_spint(t13),_spint(t12)); _amemd8(y+2) = _itod(_spint(t11),_spint(t10)); y += 4; } } Изменено 16 июля, 2012 пользователем SAURIS GmbH Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewn 0 18 июля, 2012 Опубликовано 18 июля, 2012 · Жалоба И до двух ужимается...;* Loop Carried Dependency Bound(^) : 0 Значит есть смысл использовать CGT 7.3.х; CGT 6.1.19 и 6.1.21 не могут рассчитать 2-х клоковый цикл. Вероятно, из-за того, что неправильно вычисляют LCDB = 1. Хотя этот bound равен нулю. 7.3.х кажется эту ошибку исправил (очень старая ошибка, ей несколько лет...). В остальном 6.1.21 делает тоже самое, при добавлении ассёртов выравнивания использует 2xLDDW и 2xSTDW (даже если не используются _amemd8()). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 19 июля, 2012 Опубликовано 19 июля, 2012 · Жалоба Вероятно - Вы правы. Мне так и не удалось получить 2 такта на цикл, хотя повторил, то что писал SAURIS GmbH - всё равно 3 такта. Хотя и не очень нужно - у меня по алгоритму в этой функции трудно сделать x%8==0. Зато y%8==0 - выполнимо. Только использовал _amem8(). А можно-ли прикрутить CGT 7.3.х вместо CGT 6.1.x к CCS3.3? На сайте TI для CCS3.3 имеется только CGT 6.1.x. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewn 0 19 июля, 2012 Опубликовано 19 июля, 2012 · Жалоба А можно-ли прикрутить CGT 7.3.х вместо CGT 6.1.x к CCS3.3? На сайте TI для CCS3.3 имеется только CGT 6.1.x.TI утверждает, что нельзя. CCS3.3 вероятно не поймёт С6000 EABI, но со старым TI_ABI можно попробовать. P.S. В wiki (http://processors.wiki.ti.com/) есть ссылка на CGT 7.x.x. В консольном виде точно работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sauris 0 19 июля, 2012 Опубликовано 19 июля, 2012 · Жалоба В остальном 6.1.21 делает тоже самое, при добавлении ассёртов выравнивания использует 2xLDDW и 2xSTDW (даже если не используются _amemd8()). 7.3.4 НЕ использует STDW даже с ассертами, только после _amemd8 стал использовать. Так что он поглючнее вашего будет... В том, которым вы компилируете, этого глюка еще нет. Что касается использования с 3.3 этого компилятора - все без проблем. Я запустил компонент манагер в 3.3, поставил для 64хх эту версию компилятора (она там сама оказалась, он ее увидел из инсталляции CCS5.2), и из-под 3.3 все закомпилировало. только вот -mv6740 пришлось руками вписывать, так как в списке такого не оказалось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewn 0 19 июля, 2012 Опубликовано 19 июля, 2012 · Жалоба Так что он поглючнее вашего будет...Как ослик Иа в болоте... Что касается использования с 3.3 этого компилятора - все без проблем. Я запустил компонент манагер в 3.3, поставил для 64хх эту версию компилятора (она там сама оказалась, он ее увидел из инсталляции CCS5.2), и из-под 3.3 все закомпилировало. только вот -mv6740 пришлось руками вписывать, так как в списке такого не оказалось.Здорово, надо попробовать. Что касается -mv6740, установите этот C674x CSP и оно должно появиться. У меня в 3.3.81.6 есть. Тот же файл можно списать из webvisor-а (т.е. Update Advisor-а) для CCS3: C674x CSP, на странице Chip Support Packages. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться