工具/软件:TI C/C++编译器
我想知道浮点乘法的速度限制是2746MFLOPS还是456MHZ。如果是2746Mflops,如何实现?
我为循环测试编写10万次a=b*c,优化后,每个乘法花费一个指令周期,但 花费6个CPU周期。为什么?
10万次a=b*c花费0.22ms。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:TI C/C++编译器
我想知道浮点乘法的速度限制是2746MFLOPS还是456MHZ。如果是2746Mflops,如何实现?
我为循环测试编写10万次a=b*c,优化后,每个乘法花费一个指令周期,但 花费6个CPU周期。为什么?
10万次a=b*c花费0.22ms。
为TMS320C6748引用的最大2746 MFLOPS假定每个时钟周期可以执行6个浮点运算(时钟速度为 456-MHz)。 设备引用的最大MFLOPS是理论上的最大值,由于以下因素的组合,在用户代码中不可能实现:它是2746MFLOPS或456MHZ?如果它是2746Mflops,我该如何实现?
A) C674x有多个功能单元,可以并行执行指令,但每种功能单元都支持不同的指令。 例如,有两 个.M1,.M2功能单元,它们支持 MPYSP“乘以两个单精度浮点值”指令,功能 单位延迟为1。 这意味着单精度浮点倍数的最大速率为每个周期两个或912 MFLOPS。
B)除非所有输入和输出数据都适合L1高速缓存,否则从较慢内存访问数据时会出现一定的速度减慢。
C) 可能无法实现使所有执行单元都处于忙碌状态的软件流水线循环(SPLOP)缓冲区,具体取决于 算法。
我想知道浮点乘法的速度限制吗?[/QUOT]您需要实施的实际算法是什么?
核心基准具有 不同函数的执行时间(以微秒为单位),可从中计算达到的MFLOPS。 例如,对于 运行 频率为456-MHz的C674x DSP内核:
-"Real Matrix SGEMM 16X16"是8192个浮点运算,需要7.69 微秒,相当于1065 MFLOPS
-“复杂矩阵SGEMM 16x16”,即3.2768万 浮点运算需要23.87 微秒,相当于1372 MFLOPS
如何同时使用M1.m2功能单元?我查看"装配"窗口,发现M1.m2单元只能每a=b*c使用一个;[/QUOT]我不是C674x DSP编写优化算法的专家, 但是,示例代码是标量乘法,其中乘数的参数是以前几个语句乘法的结果。以前的语句在指令之间创建依赖关系。
我猜,让C编译器使用多个功能单元的最简单方法是在向量(变量数组)上操作,其中输入和输出是编译器可以看到的独立内存位置,而不是别名。 例如以下简短示例:
#define NUM_Iterations 100
float a_VEC[NUM_Iterations ];
float b_VEC[NUM_Iterations ];
float c_VEC[NUM_Iterations ];
int main (void)
{
无符号int迭代;
对于(迭代= 0;迭代< NUM_ITExations;迭代++)
{
a_vec[迭代]= b_vec[迭代]* c_vec[迭代];
}
返回0;}
使用优化级别2编译时,生成以下列示的汇编文件,其中显示了同时使用的M1和m2功能单位:
;************************************************************************
;*函数名称: MAIN *
;* *;*
注册表已修改 :A3,A4,A5,A6,A7,B4,B5,B6,B7,B8 *;*
使用的注册表 :A3,A4,A5,A6,A7,B3,B4,B5,B6,B7,B8 *;*
本地帧大小:0 args + 0 Auto + 0 Save = 0 byte. *
;********************************************************************************
主页:
;**------------------ *;**
15--------------- L1美元=50;;**------------------
U19美元 =&A_VEC[-2];;**------------------
U11美元 =&c_VEC;
;**--------------------------- U6美元 =&b_vec;
;**--------------------------- #pragma must迭代(50,50,50)
;** --------------------------- //以下循环按系数(2)展开
;**------------------ #pragma loop_flags(4098u)
;**------------------ G2:
;** 17--------------- vec$f32x2001美元 =*U6美元++{8};**17---------------
vec$f32x2002美元 =*U11美元+{8};**17---------------
*(U19美元+=2)=__subvec(0), VEC$f32x2001美元)*__subvec(0), VEC$f32x2002美元);
;** 17----------- U19美元[1]=__subvec(1),VEC$f32x2001美元)*__subvec(1),VEC$f32x2002美元);
;** 15---------- 如果(L1美元 = L1美元-1)转到G2;
.dwpsn 文件"../main.c",第15行,第25列,is_stmt,ISA 0
MVK S2 0x32,B4 ;[B_Sb674]|15|
子 .L2 B4,2,B4 ;[B_L674]
|| MVKL .S2 B_VEC,B5 ;[B_Sb674]
MVC S2 B4,ILC ;[B_Sb674]
|| MVKL .S1 C_VEC,A5 ;[A_S674]
;*------------------ *;*
软件管道信息
;*;*
在文件中找到循环 :../main.c
;* 循环源线 :15
;* 循环开环花括号源行:16;*
环闭合花括号源行:18;*
循环展开多个 :2x
;* 已知最小行程计数 50岁
;* 已知最大行程计数 50岁
;* 已知最大跳闸计数因子 :50
;* 循环带依赖关系绑定(^):0
;* 未分区的资源绑定 :2
;* 分区资源绑定(*):2;*
资源分区:
;* A侧B侧
;* .L单位 0 0
;* .S单位 0 0
;* D单位 2星 2星
;* M单位 1. 1.
;* X交叉路径 1. 1.
;* .T地址路径 二 二
;* 逻辑操作(.lS) 0 0 (.L或.S单位)
;* 附加操作(.LSD) 0 0 (.L或.S或.D单位)
;* Bound (.L .S .LS) 0 0
;* Bound (.L .S .D .LS .LSD) 1. 1.
;*
;* 正在搜索软件管道计划...
;* II =2平行5次迭代的计划
;* 完成
;*;*
循环将被上载
;* 折叠的脱毛阶段 :0
;* 折叠的Prologue阶段 :0
;* 所需的最小内存垫:0字节
;*
;* 最小安全跳闸计数 :1 (展开后)
;*------------------ *
$C$L1:;管道循环PROLOGUE
SPLOOPD 二 ;10 ;[A_L674](P)
|| MVKH .S1 C_VEC,A5 ;[A_S674]
|| MVKH .S2 B_VEC,B5 ;[B_Sb674]
;**------------------ *
$C$L2:;管道循环内核
.dwpsn 文件"../main.c",第17行,第9列,is_stmt,ISA 0
LDDW .d2T2 *B5++(8),B7:B6;[B_D64P]|17|(P)<0,0>||
LDDW .d1T1 *A5+(8),A7:A6;[A_D64P]|17|(P)<0,0>
无操作 1. ;[A_L674]
SPMACK ;[]
||^ MVKL .S2 A_VEC,B4 ;[B_Sb674]
SPMACK ;[]
||^ MVKH .S2 A_VEC,B4 ;[B_Sb674]
SPMACK ;[]
||^ 子 .L2 B4,8,B4 ;[B_L674]
MPYSP .M2X A6,B6,B8 ;[B_M674]|17|(P)<0,5>||
MPYSP .M1X A7,B7,A3 ;[A_M674]|17|(P)<0,5>
SPMACK ;[]
||^ 添加 .L1x 12,B4,A4 ;[A_L674]
SPMACK ;[]
||^ 添加 .L2 8,B4,B4 ;[B_L674]
无操作 1. ;[A_L674]
SPKERNEL 1,0 ;[]||
STW .d2T2 B8,* B4++(8) ;[B_D64P]|17|<0,9>||
STW .D1T1 A3,* A4++(8) ;[A_D64P]|17|<0,9>
;**---------------------------------- *$C$L3:
;管道环EPILOGUE;**
20------------------ 返回0;
无操作 1. ;[A_L674]
.dwpsn 文件"../main.c",行21,列1,is_stmt,ISA 0
$C$DW9美元 .dwtag DW_TI_BRANCH
.dwattr $C$DW9美元,DW_AT_LOW_PC(0x00)
.dwattr$C$DW_9美元,TI_RETURN
RETNOP B3.4. ;[]|21|
.dwpsn 文件"../main.c",第20行,第5列,is_stmt,ISA 0
零.L1 回答4 ;[A_L674]|20|
.dwpsn 文件"../main.c",第21行,第1列,is_stmt,ISA 0
;分支发生{B3} ;[]|21|
编辑: TMS320C674x DSP CPU和指令集参考指南 包含有关DSP管道和 软件流水线环路(SPLOP)缓冲器的信息,这些信息可能有助于了解如何最大限度地提高性能。