Перейти к содержанию
    

или лыжи не едут или глюк оптимизатора CCS3.3

И до двух ужимается...

 

//        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;
  }

}

 

 

Изменено пользователем SAURIS GmbH

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И до двух ужимается...
;*      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()).

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вероятно - Вы правы. Мне так и не удалось получить 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можно-ли прикрутить 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. В консольном виде точно работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В остальном 6.1.21 делает тоже самое, при добавлении ассёртов выравнивания использует 2xLDDW и 2xSTDW (даже если не используются _amemd8()).

 

7.3.4 НЕ использует STDW даже с ассертами, только после _amemd8 стал использовать. Так что он поглючнее вашего будет... В том, которым вы компилируете, этого глюка еще нет.

 

Что касается использования с 3.3 этого компилятора - все без проблем. Я запустил компонент манагер в 3.3, поставил для 64хх эту версию компилятора (она там сама оказалась, он ее увидел из инсталляции CCS5.2), и из-под 3.3 все закомпилировало. только вот -mv6740 пришлось руками вписывать, так как в списке такого не оказалось.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так что он поглючнее вашего будет...
Как ослик Иа в болоте...

Что касается использования с 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.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...