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

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

Вернул обратно на C674x - всё вернулось к старому моему результату - похоже не даёт оптимизить тип процессора
Учите матчасть. Ваш код без переделок, -mv6740:
;*         ii = 2  Schedule found with 8 iterations in parallel

Вероятно, это еще не предел, если использовать 2xLDDW и 2xSTDW (для n кратного 4).

 

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


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

Вероятно, это еще не предел, если использовать 2xLDDW и 2xSTDW (для n кратного 4).

 

Да, по ходу не предел. если будет 2 LDDW и 2 STDW, то к этому нужно соответственно 4 MPYSP, 4 SSHL и 4 SPINT. На юниты это раскладывается - 4 операции на D (LDDW, STDW), 4 на S (SSHL), 4 на M (MPYSP) и 4 на L (SPINT). Это полная загрузка CPU как раз на 2 такта.

 

ну и еще, SSHL нафиг не нужны. SPINT сама по себе насыщает оператор-приемник при переполнениях, так что можно сразу умножать в MPYSP с учетом будущего SSHL, а SSHL выкинуть нафиг как лишнюю операцию.

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


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

Вечером попробую -mv6740 - но что-то не помню такой опции в компилёре....

ну и еще, SSHL нафиг не нужны. SPINT сама по себе насыщает оператор-приемник при переполнениях, так что можно сразу умножать в MPYSP с учетом будущего SSHL, а SSHL выкинуть нафиг как лишнюю операцию.

Учту. Я сомневался, что SPINT отрабатывает насыщение, поэтому и поставил сдвиг

 

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


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

Учту. Я сомневался, что SPINT отрабатывает насыщение, поэтому и поставил сдвиг

 

А читать документацию не позволяет религия?

 

2. If src2 is signed infinity or if overflow occurs, the maximum signed integer (7FFF FFFFh or 8000 0000h) is placed in dst and the INEX and OVER bits are set. Overflow occurs if src2 is greater than 2^31 − 1 or less than −2^31.

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


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

А читать документацию не позволяет религия?

Даже с этими сдвигами должно быть гораздо оптимальнее чем компилится. Не в них главная проблема.

 

Учите матчасть. Ваш код без переделок, -mv6740:
;*         ii = 2  Schedule found with 8 iterations in parallel

Вероятно, это еще не предел, если использовать 2xLDDW и 2xSTDW (для n кратного 4).

Сейчас пришёл и посмотрел в проект - вообще-то у меня изначально стояло -mv6740, и то что я приводил вначале - это с помощью него и скомпилено.

Так что - мимо кассы. :laughing:

Лучше покажите как вы этого добились "8 iterations in parallel"?

У меня "ii = 4 Schedule found with 4 iterations in parallel" и длина цикла ==16тактов. Именно с -mv6740

 

Да, по ходу не предел. если будет 2 LDDW и 2 STDW, то к этому нужно соответственно 4 MPYSP, 4 SSHL и 4 SPINT. На юниты это раскладывается - 4 операции на D (LDDW, STDW), 4 на S (SSHL), 4 на M (MPYSP) и 4 на L (SPINT). Это полная загрузка CPU как раз на 2 такта.

2 LDDW и 2 STDW - я пока и не мечтаю. Если-б компилятор хотя-бы эти NOP-ы убрал.......

В другой функции у меня получаются 2 LDDW в параллель, но после них стоит NOP 4, который убивает всю пользу от этих LDDW :(

 

PS: Сейчас попробовал разные ключики: -mv6700, -mv6710, -mv6740, -mv67p - при всех кроме -mv6740 получается цикл в 4 такта, и только при -mv6740 дыра какая-то.... :01:

Причём нигде кроме -mv6740 не используется SPLOOP

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


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

1. Не надо бороться с нопами. С ними борется железо SPLOOP-буфера, когда осуществляет конвейеризацию тела цикла. Смотрите ТОЛЬКО на "SPLOOP N", на число N, которое равно "ii" из комментариев к циклу, оно есть реальное число тактов CPU в одной итерации. А не то, сколько инструкций забито в SPLOOP-буфере.

 

2. Попробуйте поставить Speculative threshold побольше, 40, 56, скорее всего сразу и получите 8 впараллель.

 

3. Ясное дело, что когда цикл конвейеризируется средствами SPLOOP, то в нем стоят NOP-ы, а когда без SPLOOP-железа, то компилируется в аццко-параллельную конструкцию. Это два разных метода реализации одного и того же. Короче, при SPLOOP-конвейеризации NOP-ы в большом количестве это норма жизни, так и должно быть. Реальное число тактов тела цикла = ii = аргументу команды SPLOOP

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


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

Лучше покажите как вы этого добились "8 iterations in parallel"?
Вскрытие покажет... Было бы любопытно посмотреть на шапочку в вашем сгенерированном .asm файле от
;* GLOBAL FILE PARAMETERS                                                     *
до
;*   Debug Info        : No Debug Info                                        *

 

 

Это полная загрузка CPU как раз на 2 такта.
Да, не спорю. В стародавние времена (до изобретения sp buffer'a) имело смысл растягивать II до > 5, и одновременно заполнять конвейер как можно полнее - понятно почему. Буфер слегка изменил ситуацию в сторону смягчения трудозатрат.

 

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


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

Было бы любопытно посмотреть на шапочку в вашем сгенерированном .asm файле от

Пожалуйста:

;* GLOBAL FILE PARAMETERS                                                     *
;*                                                                            *
;*   Architecture      : TMS320C674x                                          *
;*   Optimization      : Enabled at level 3                                   *
;*   Optimizing for    : Speed                                                *
;*                       Based on options: -o3, no -ms                        *
;*   Endian            : Little                                               *
;*   Interrupt Thrshld : 3000                                                 *
;*   Data Access Model : Far Aggregate Data                                   *
;*   Pipelining        : Enabled                                              *
;*   Speculate Loads   : Disabled                                             *
;*   Memory Aliases    : Presume are aliases (pessimistic)                    *
;*   Debug Info        : DWARF Debug for Program Analysis w/Optimization      *

Не знаю как у вас получилось "No Debug Info", у меня в свойствах проекта отключена debug info везде где можно (и в опциях компилятора и линкёра).

 

1. Не надо бороться с нопами. С ними борется железо SPLOOP-буфера, когда осуществляет конвейеризацию тела цикла. Смотрите ТОЛЬКО на "SPLOOP N", на число N, которое равно "ii" из комментариев к циклу, оно есть реальное число тактов CPU в одной итерации. А не то, сколько инструкций забито в SPLOOP-буфере.

Похоже - не совсем так. Я, как Вы советовали, убрал сдвиги из цикла, в результате - кол-во команд в теле цикла значительно уменьшилось, и загрузка процессора заметно уменьшилась.

Но заголовок цикла остался тем-же: "SPLOOPD 4 ;16"

см. результаты замеров ниже.

2. Попробуйте поставить Speculative threshold побольше, 40, 56, скорее всего сразу и получите 8 впараллель.

Я пробовал ставить его ==64 - тело цикла не меняется ни на команду.

 

Вот тело цикла с _sshl():

           SPLOOPD 4    ;16            ; (P)              
||         SUB     .L1     A3,8,A16                             
||         SUB     .D1     A3,16,A3                             
||         MVC     .S2X    A4,ILC                               
                                                                
;** ------------------------------------------------------------
$C$L4: ; PIPED LOOP KERNEL                                   
$C$DW$L$_DSPF_fltoq31__FPCfPii$7$B:                             
                                                                
           LDW     .D1T1   *A3--(16),A7; |121| (P) <0,0>  
||         LDW     .D2T2   *B6--(16),B16; |122| (P) <0,0>  
                                                                
           LDW     .D1T1   *A16--(16),A8; |123| (P) <0,1>  
||         LDW     .D2T2   *B9--(16),B8; |125| (P) <0,1>  
                                                                
           NOP             3                                    
                                                                
           MPYSP   .M1     A17,A7,A6; |121| (P) <0,5>  
||         MPYSP   .M2X    A17,B16,B8     ; |122| (P) <0,5>  
                                                                
           MPYSP   .M1     A17,A8,A6; |123| (P) <0,6>  
||         MPYSP   .M2X    A17,B8,B5; |125| (P) <0,6>  
                                                                
           SPMASK          D2                                   
||         SUB     .D2     B10,16,B10                           
                                                                
           SPMASK          L2,S2                                
||         MV      .L2     B10,B4                               
||         MV      .S2     B10,B7                               
                                                                
           SPMASK          S1                                   
||         MV      .S1X    B10,A5                               
||         SPINT   .L1     A6,A8    ; |121| (P) <0,9>  
||         SPINT   .L2     B8,B5    ; |122| (P) <0,9>  
                                                                
           SPMASK          S1,D1,S2                             
||         ADDK    .S2     24,B7                                
||         MV      .D1X    B10,A4                               
||         ADDK    .S1     28,A5                                
||         SPINT   .L1     A6,A9    ; |123| (P) <0,10> 
||         SPINT   .L2     B5,B17         ; |125| (P) <0,10> 
                                                                
           SPMASK          S1,S2                                
||         ADDK    .S2     16,B4                                
||         ADDK    .S1     20,A4                                
                                                                
           NOP             1                                    
                                                                
           SSHL    .S2     B5,8,B16    ; |127| <0,13>     
||         SSHL    .S1     A8,8,A7        ; |128| <0,13>     
                                                                
           STW     .D2T2   B16,*B7++(16); |127| <0,14>     
||         STW     .D1T1   A7,*A5++(16); |128| <0,14>     
||         SSHL    .S1     A9,8,A6        ; |126| <0,14>     
||         SSHL    .S2     B17,8,B5    ; |125| <0,14>     
                                                                
        .dwpsn  file "DSPF_fltoq31.c",line 129,column 0,is_stmt 
                                                                
           SPKERNEL 3,0                                         
||         STW     .D1T1   A6,*A4++(16); |126| <0,15>     
||         STW     .D2T2   B5,*B4++(16); |125| <0,15>

 

Вот - без _sshl():

           SPLOOPD 4    ;16            ; (P)             
||         MVC     .S2X    A4,ILC                              
                                                               
;** -----------------------------------------------------------
$C$L4: ; PIPED LOOP KERNEL                                  
$C$DW$L$_DSPF_fltoq31__FPCfPii$7$B:                            
                                                               
           SPMASK          L2                                  
||         ADD     .L2X    8,A3,B5                             
||         LDNDW   .D1T1   *A3--(16),A9:A8; |124| (P) <0,0> 
                                                               
           LDNDW   .D2T2   *B5--(16),B9:B8; |122| (P) <0,1> 
           NOP             3                                   
           MPYSP   .M1     A7,A8,A4    ; |124| (P) <0,5> 
                                                               
           MPYSP   .M2X    A7,B8,B6    ; |122| (P) <0,6> 
||         MPYSP   .M1     A7,A9,A8    ; |124| (P) <0,6> 
                                                               
           MPYSP   .M2X    A7,B9,B8    ; |122| (P) <0,7> 
           NOP             1                                   
           SPINT   .L1     A4,A5    ; |124| (P) <0,9> 
                                                               
           SPINT   .L2     B6,B7    ; |122| (P) <0,10>
||         SPINT   .L1     A8,A4    ; |124| (P) <0,10>
                                                               
           SPMASK          L1,S2                               
||         MV      .S2     B10,B4                              
||         ADD     .L1X    8,B10,A6                            
||         SPINT   .L2     B8,B6    ; |122| (P) <0,11>
                                                               
           NOP             2                                   
           STNDW   .D1T1   A5:A4,*A6++(16); |124| <0,14>    
        .dwpsn  file "DSPF_fltoq31.c",line 125,column 0,is_stmt
                                                               
           SPKERNEL 3,0                                        
||         STNDW   .D2T2   B7:B6,*B4++(16); |122| <0,15>

 

Загрузка процессора (на этой функции) уменьшилась на 40% !!!

Т.е. - в первом варианте полная загрузка процессора задачей составляла == 8.8%

Во-втором варианте полная загрузка процессора задачей == 8.2%

При закомментировании этой функции (выполняется только остальная обработка) == 7.3%

 

Хотя - если посчитать по командам - оба варианта должны быть одинаковы.... :wacko:

Код функции и вх. данные линкуются во внутреннюю L2-память, выходные данные - во внутренней L3-памяти.

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


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

Пожалуйста:
Показало: не используются следующие опции: -mt (увы, за всякую глупость, придуманную K&R, приходится платить пользователям этой глупости...), -mw, -mh (здесь не надо циферок, компилятор сам подставит нужную), --symdebug:none (это ручками приходится вписывать), -mi1 (прерываемость на _каждом_ (по возможности, конечно) такте CPU). Должно получиться.

 

 

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


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

У вас Debug info включена! Выключите ее. Для этого достаточно собрать конфигурацию "Release", если сами не можете найти, где ее выключить. Должно быть ii=2, а не 4, при правильно заданных опциях. То есть ВДВОЕ должно ускориться.

 

Что касается разной загрузки при циклах из 4-х тактов на итерацию, это какие-то чудеса. Видимо измеритель загрузки глючит. Измеряйте длину функции считыванием числа из счетчика аппаратного таймера до и после ф-ции, только так можно узнать реальность.

 

;******************************************************************************
;* TMS320C6x C/C++ Codegen                                          PC v7.3.4 *
;* Date/Time created: Thu Jul 12 20:59:43 2012                                *
;******************************************************************************
.compiler_opts --abi=coffabi --c64p_l1d_workaround=off --endian=little --hll_source=on --long_precision_bits=40 --mem_model:code=near --mem_model:const=data --mem_model:data=far_aggregates --object_format=coff --silicon_version=6740 --symdebug:none 

;******************************************************************************
;* GLOBAL FILE PARAMETERS                                                     *
;*                                                                            *
;*   Architecture      : TMS320C674x                                          *
;*   Optimization      : Enabled at level 3                                   *
;*   Optimizing for    : Speed                                                *
;*                       Based on options: -o3, no -ms                        *
;*   Endian            : Little                                               *
;*   Interrupt Thrshld : Disabled                                             *
;*   Data Access Model : Far Aggregate Data                                   *
;*   Pipelining        : Enabled                                              *
;*   Speculate Loads   : Enabled with threshold = 57                          *
;*   Memory Aliases    : Presume not aliases (optimistic)                     *
;*   Debug Info        : No Debug Info                                        *
;*                                                                            *
;******************************************************************************

.asg	A15, FP
.asg	B14, DP
.asg	B15, SP
.global	$bss

;	G:\CCS5.2.0.00069\ccsv5\tools\compiler\c6000_7.3.4\bin\opt6x.exe C:\\DOCUME~1\\s-markov\\LOCALS~1\\Temp\\038242 C:\\DOCUME~1\\s-markov\\LOCALS~1\\Temp\\038244 
.sect	".text"
.clink
.global	_DSPF_fltoq31

;******************************************************************************
;* FUNCTION NAME: DSPF_fltoq31                                                *
;*                                                                            *
;*   Regs Modified     : A3,A4,A5,A6,A7,A8,A9,B5,A16,A17                      *
;*   Regs Used         : A3,A4,A5,A6,A7,A8,A9,B3,B4,B5,A16,A17                *
;*   Local Frame Size  : 0 Args + 0 Auto + 0 Save = 0 byte                    *
;******************************************************************************
_DSPF_fltoq31:
;** --------------------------------------------------------------------------*
;          EXCLUSIVE CPU CYCLES: 5
          SHR     .S2X    A6,1,B5           ; |13| 
          MVC     .S2     B5,ILC
          ADDAW   .D1     A4,A6,A7
          NOP             2
;*----------------------------------------------------------------------------*
;*   SOFTWARE PIPELINE INFORMATION
;*
;*      Loop found in file               : ../test.c
;*      Loop source line                 : 13
;*      Loop opening brace source line   : 13
;*      Loop closing brace source line   : 22
;*      Known Minimum Trip Count         : 1                    
;*      Known Max Trip Count Factor      : 1
;*      Loop Carried Dependency Bound(^) : 0
;*      Unpartitioned Resource Bound     : 1
;*      Partitioned Resource Bound(*)    : 2
;*      Resource Partition:
;*                                A-side   B-side
;*      .L units                     2*       0     
;*      .S units                     2*       0     
;*      .D units                     1        1     
;*      .M units                     2*       0     
;*      .X cross paths               0        0     
;*      .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)             2*       0     
;*      Bound(.L .S .D .LS .LSD)     2*       1     
;*
;*      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        
;*----------------------------------------------------------------------------*
;*        SINGLE SCHEDULED ITERATION
;*
;*        $C$C22:
;*   0              LDNDW   .D1T1   *A7--(8),A9:A8    ; |18| 
;*   1              NOP             4
;*   5              MPYSP   .M1     A16,A8,A6         ; |18| 
;*   6              MPYSP   .M1     A16,A9,A4         ; |18| 
;*   7              NOP             2
;*   9              SPINT   .L1     A6,A3             ; |18| 
;*  10              SPINT   .L1     A4,A3             ; |18| 
;*  11              NOP             2
;*  13              SSHL    .S1     A3,8,A5           ; |18| 
;*  14              SSHL    .S1     A3,8,A4           ; |18| 
;*  15              STNDW   .D1T1   A5:A4,*A17++(8)   ; |18| 
;*     ||           SPBR            $C$C22
;*  16              ; BRANCHCC OCCURS {$C$C22}        ; |13| 
;*----------------------------------------------------------------------------*
$C$L1:    ; PIPED LOOP PROLOG
;          EXCLUSIVE CPU CYCLES: 15

          SPLOOP  2       ;16               ; (P) 
||         SUB     .L1     A7,8,A7

;** --------------------------------------------------------------------------*
$C$L2:    ; PIPED LOOP KERNEL
;          EXCLUSIVE CPU CYCLES: 2
          LDNDW   .D1T1   *A7--(8),A9:A8    ; |18| (P) <0,0> 
          NOP             2

          SPMASK          L1
||         ZERO    .L1     A16

          SPMASK          S1
||         MVKH    .S1     0x4b000000,A16

          MPYSP   .M1     A16,A8,A6         ; |18| (P) <0,5> 
          MPYSP   .M1     A16,A9,A4         ; |18| (P) <0,6> 
          NOP             2
          SPINT   .L1     A6,A3             ; |18| (P) <0,9> 
          SPINT   .L1     A4,A3             ; |18| (P) <0,10> 
          NOP             2

          SPMASK          D1
||         MV      .D1X    B4,A17
||         SSHL    .S1     A3,8,A5           ; |18| (P) <0,13> 

          SSHL    .S1     A3,8,A4           ; |18| <0,14> 

          SPKERNEL 4,0
||         STNDW   .D1T1   A5:A4,*A17++(8)   ; |18| <0,15> 

;** --------------------------------------------------------------------------*
$C$L3:    ; PIPED LOOP EPILOG
;          EXCLUSIVE CPU CYCLES: 14
          RETNOP  .S2     B3,5              ; |23| 
          ; BRANCH OCCURS {B3}              ; |23| 

;******************************************************************************
;* BUILD ATTRIBUTES                                                           *
;******************************************************************************
.battr "TI", Tag_File, 1, Tag_ABI_stack_align_needed(0)
.battr "TI", Tag_File, 1, Tag_ABI_stack_align_preserved(0)
.battr "TI", Tag_File, 1, Tag_Tramps_Use_SOC(1)

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

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


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

Показало: не используются следующие опции: -mt (увы, за всякую глупость, придуманную K&R, приходится платить пользователям этой глупости...), -mw, -mh (здесь не надо циферок, компилятор сам подставит нужную), --symdebug:none (это ручками приходится вписывать), -mi1 (прерываемость на _каждом_ (по возможности, конечно) такте CPU). Должно получиться.

Почти всё выполнил, но цикл остался таким-же - 4 такта.

.compiler_opts --c64p_l1d_workaround=off --endian=little --hll_source=on --mem_model:code=near --mem_model:const=data --mem_model:data=far_aggregates --silicon_version=6740 --symdebug:none
;* GLOBAL FILE PARAMETERS                                                     *
;*   Architecture      : TMS320C674x                                          *
;*   Optimization      : Enabled at level 3                                   *
;*   Optimizing for    : Speed                                                *
;*                       Based on options: -o3, no -ms                        *
;*   Endian            : Little                                               *
;*   Interrupt Thrshld : 3000                                                 *
;*   Data Access Model : Far Aggregate Data                                   *
;*   Pipelining        : Enabled                                              *
;*   Speculate Loads   : Enabled                                              *
;*   Memory Aliases    : Presume not aliases (optimistic)                     *
;*   Debug Info        : No Debug Info                                        *

$C$L3:  ; PIPED LOOP PROLOG
;          EXCLUSIVE CPU CYCLES: 13

           SPLOOPD 4     ;16             ; (P)
||         MVC     .S2X    A4,ILC

;** --------------------------------------------------------------------------*
$C$L4:  ; PIPED LOOP KERNEL
;          EXCLUSIVE CPU CYCLES: 4

           SPMASK          L2
||         ADD     .L2X    8,A3,B5
||         LDNDW   .D1T1   *A3--(16),A9:A8 ; |124| (P) <0,0>

           LDNDW   .D2T2   *B5--(16),B9:B8 ; |122| (P) <0,1>
           NOP             3
           MPYSP   .M1     A7,A8,A4        ; |124| (P) <0,5>

           MPYSP   .M2X    A7,B8,B6        ; |122| (P) <0,6>
||         MPYSP   .M1     A7,A9,A8        ; |124| (P) <0,6>

           MPYSP   .M2X    A7,B9,B8        ; |122| (P) <0,7>
           NOP             1
           SPINT   .L1     A4,A5        ; |124| (P) <0,9>

           SPINT   .L2     B6,B7        ; |122| (P) <0,10>
||         SPINT   .L1     A8,A4        ; |124| (P) <0,10>

           SPMASK          L1,S2
||         MV      .S2     B10,B4
||         ADD     .L1X    8,B10,A6
||         SPINT   .L2     B8,B6        ; |122| (P) <0,11>

           NOP             2
           STNDW   .D1T1   A5:A4,*A6++(16) ; |124| <0,14>

           SPKERNEL 3,0
||         STNDW   .D2T2   B7:B6,*B4++(16) ; |122| <0,15>

Вот какие опции в свойствах проекта:

-pdsw225 -al -o3 -fg -fr"$(Proj_dir)\RELEASE.OUT" -fs"$(Proj_dir)\RELEASE.OUT" -ft"$(Proj_dir)\RELEASE.OUT" -i"$(Proj_dir)" -i"$(Proj_dir)\.." -i"$(Proj_dir)\lib_dsp_math" -i"$(Proj_dir)\processing_framework" -mt -mw -mh -mi3000 -mf5 -mv6740 --mem_model:const=data --single_inline --symdebug:none

 

У вас Debug info включена! Выключите ее. Для этого достаточно собрать конфигурацию "Release", если сами не можете найти, где ее выключить. Должно быть ii=2, а не 4, при правильно заданных опциях. То есть ВДВОЕ должно ускориться.
У меня и была Release. Помогла ручная вставка опции "--symdebug:none" (спасибо AndrewN). но результат остался тот же :((

Единственное существенное отличие (не считая COFF) от ваших опций - мне не удалось найти где включить "--long_precision_bits=40", при ручной вставке компилёр ругается:

WARNING: invalid compiler option --long_precision_bits=40 (ignored)

 

Что касается разной загрузки при циклах из 4-х тактов на итерацию, это какие-то чудеса. Видимо измеритель загрузки глючит. Измеряйте длину функции считыванием числа из счетчика аппаратного таймера до и после ф-ции, только так можно узнать реальность.
Измеритель оттестирован на таймере - всё сошлось до 1% - так что вряд-ли. Возможно повлияло что цикл стал короче и грузиться в конвеер стал быстрее.

 

Возможно вся причина что у меня 4 такта, а у вас ==2 в этом: ???

;* TMS320C6x C/C++ Codegen PC v7.3.4 *
У меня: v6.1.21

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


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

Возможно вся причина что у меня 4 такта, а у вас ==2 в этом: ???

У меня: v6.1.21

 

так дайте новый С-код. А то ведь я компилил явно не это, а то, что было в первом посте.

 

Что касается времени загрузки в конвейер - разница на единицы тактов. Так что мимо.

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

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


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

так дайте новый С-код. А то ведь я компилил явно не это, а то, что было в первом посте.

просто _sshl() убрал. Вот:

#pragma CODE_SECTION(".text:optimized")
#pragma FUNC_INTERRUPT_THRESHOLD(-1)
void DSPF_fltoq31(const float* restrict x, int * restrict y, int n)
{
  int fadcr_store;
  float t00, t01, t02, t03, t10, t11, t12, t13;

  _nassert(n > 0);
  _nassert(n % 4 == 0);

  fadcr_store = FADCR; //preserve the FADCR value
  FADCR = _set(FADCR, 9, 10); //set FADCR bits to switch to ROUND TOWARD NEGATIVE INF
  FADCR = _set(FADCR, 25, 26); //set mode for both L units

  #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++ = _spint(t13);  //use intrinsic to convert the number to integer
    *y++ = _spint(t12);
    *y++ = _spint(t11);
    *y++ = _spint(t10);
  }
  FADCR = fadcr_store; //restore the FADCR value
}

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


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

Ха. Первая версия была из двух операций в теле цикла, а эта из четырех. В этом и разница. Не делает компилятор ii=2 для этого цикла (почему - не знаю, возможно какие-то конфликты путей данных, или еще что-то такое эдакое), хотя я сам вижу schedule для ii=2 в SPLOOP-цикле..

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


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

Вот
Новый код, новый код - эт почти ж то новый год... Пардон.

 

Исходный код параллелится до Partitioned Resource Bound(*) : 4, из-за неявного предположения компилятора о том, что массивы не выровнены, поэтому используются N-варианты load и store, по одному на клок.

 

Если немного подправить выравнивание:

  _nassert((int) x % 8 == 0);
  _nassert((int) y % 8 == 0);

то ii ужимается до 3 клоков, при Partitioned Resource Bound(*) : 3.

 

Если ещё немного модифицировать

  for (k = 0; (n -= 4) >= 0; k += 4)
    ...
    y[k + 0] = _spint(t13);
    y[k + 1] = _spint(t12);
    y[k + 2] = _spint(t11);
    y[k + 3] = _spint(t10);

то уменьшается Partitioned Resource Bound(*) : 2, а вот ii до 2 всё равно не ужимается. Интересно понять почему, но на это нужно потратить некоторое время...

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

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


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

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

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

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

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

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

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

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

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

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