andrewn 0 12 июля, 2012 Опубликовано 12 июля, 2012 · Жалоба Вернул обратно на C674x - всё вернулось к старому моему результату - похоже не даёт оптимизить тип процессораУчите матчасть. Ваш код без переделок, -mv6740:;* ii = 2 Schedule found with 8 iterations in parallel Вероятно, это еще не предел, если использовать 2xLDDW и 2xSTDW (для n кратного 4). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sauris 0 13 июля, 2012 Опубликовано 13 июля, 2012 · Жалоба Вероятно, это еще не предел, если использовать 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 выкинуть нафиг как лишнюю операцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 13 июля, 2012 Опубликовано 13 июля, 2012 · Жалоба Вечером попробую -mv6740 - но что-то не помню такой опции в компилёре.... ну и еще, SSHL нафиг не нужны. SPINT сама по себе насыщает оператор-приемник при переполнениях, так что можно сразу умножать в MPYSP с учетом будущего SSHL, а SSHL выкинуть нафиг как лишнюю операцию. Учту. Я сомневался, что SPINT отрабатывает насыщение, поэтому и поставил сдвиг Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sauris 0 13 июля, 2012 Опубликовано 13 июля, 2012 · Жалоба Учту. Я сомневался, что 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 13 июля, 2012 Опубликовано 13 июля, 2012 · Жалоба А читать документацию не позволяет религия? Даже с этими сдвигами должно быть гораздо оптимальнее чем компилится. Не в них главная проблема. Учите матчасть. Ваш код без переделок, -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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sauris 0 13 июля, 2012 Опубликовано 13 июля, 2012 · Жалоба 1. Не надо бороться с нопами. С ними борется железо SPLOOP-буфера, когда осуществляет конвейеризацию тела цикла. Смотрите ТОЛЬКО на "SPLOOP N", на число N, которое равно "ii" из комментариев к циклу, оно есть реальное число тактов CPU в одной итерации. А не то, сколько инструкций забито в SPLOOP-буфере. 2. Попробуйте поставить Speculative threshold побольше, 40, 56, скорее всего сразу и получите 8 впараллель. 3. Ясное дело, что когда цикл конвейеризируется средствами SPLOOP, то в нем стоят NOP-ы, а когда без SPLOOP-железа, то компилируется в аццко-параллельную конструкцию. Это два разных метода реализации одного и того же. Короче, при SPLOOP-конвейеризации NOP-ы в большом количестве это норма жизни, так и должно быть. Реальное число тактов тела цикла = ii = аргументу команды SPLOOP Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewn 0 13 июля, 2012 Опубликовано 13 июля, 2012 · Жалоба Лучше покажите как вы этого добились "8 iterations in parallel"?Вскрытие покажет... Было бы любопытно посмотреть на шапочку в вашем сгенерированном .asm файле от;* GLOBAL FILE PARAMETERS * до ;* Debug Info : No Debug Info * Это полная загрузка CPU как раз на 2 такта.Да, не спорю. В стародавние времена (до изобретения sp buffer'a) имело смысл растягивать II до > 5, и одновременно заполнять конвейер как можно полнее - понятно почему. Буфер слегка изменил ситуацию в сторону смягчения трудозатрат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 15 июля, 2012 Опубликовано 15 июля, 2012 · Жалоба Было бы любопытно посмотреть на шапочку в вашем сгенерированном .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% Хотя - если посчитать по командам - оба варианта должны быть одинаковы.... Код функции и вх. данные линкуются во внутреннюю L2-память, выходные данные - во внутренней L3-памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewn 0 15 июля, 2012 Опубликовано 15 июля, 2012 · Жалоба Пожалуйста:Показало: не используются следующие опции: -mt (увы, за всякую глупость, придуманную K&R, приходится платить пользователям этой глупости...), -mw, -mh (здесь не надо циферок, компилятор сам подставит нужную), --symdebug:none (это ручками приходится вписывать), -mi1 (прерываемость на _каждом_ (по возможности, конечно) такте CPU). Должно получиться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sauris 0 15 июля, 2012 Опубликовано 15 июля, 2012 (изменено) · Жалоба У вас 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) Изменено 15 июля, 2012 пользователем SAURIS GmbH Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 16 июля, 2012 Опубликовано 16 июля, 2012 · Жалоба Показало: не используются следующие опции: -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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sauris 0 16 июля, 2012 Опубликовано 16 июля, 2012 (изменено) · Жалоба Возможно вся причина что у меня 4 такта, а у вас ==2 в этом: ??? У меня: v6.1.21 так дайте новый С-код. А то ведь я компилил явно не это, а то, что было в первом посте. Что касается времени загрузки в конвейер - разница на единицы тактов. Так что мимо. Изменено 16 июля, 2012 пользователем SAURIS GmbH Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 16 июля, 2012 Опубликовано 16 июля, 2012 · Жалоба так дайте новый С-код. А то ведь я компилил явно не это, а то, что было в первом посте. просто _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 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sauris 0 16 июля, 2012 Опубликовано 16 июля, 2012 · Жалоба Ха. Первая версия была из двух операций в теле цикла, а эта из четырех. В этом и разница. Не делает компилятор ii=2 для этого цикла (почему - не знаю, возможно какие-то конфликты путей данных, или еще что-то такое эдакое), хотя я сам вижу schedule для ii=2 в SPLOOP-цикле.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewn 0 16 июля, 2012 Опубликовано 16 июля, 2012 (изменено) · Жалоба ВотНовый код, новый код - эт почти ж то новый год... Пардон. Исходный код параллелится до 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 всё равно не ужимается. Интересно понять почему, но на это нужно потратить некоторое время... Изменено 16 июля, 2012 пользователем AndrewN Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться