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.

[参考译文] 编译器:C6748的速度限制

Guru**** 2524460 points
Other Parts Discussed in Thread: TMS320C6748

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/588695/compiler-the-speed-limit-of-c6748

主题中讨论的其他部件:TMS320C6748

工具/软件:TI C/C++编译器

我想知道浮点乘法的速度限制是2746MFLOPS还是456MHZ。如果是2746Mflops,如何实现?

我为循环测试编写10万次a=b*c,优化后,每个乘法花费一个指令周期,但 花费6个CPU周期。为什么?

10万次a=b*c花费0.22ms。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    它是2746MFLOPS或456MHZ?如果它是2746Mflops,我该如何实现?

     为TMS320C6748引用的最大2746 MFLOPS假定每个时钟周期可以执行6个浮点运算(时钟速度为 456-MHz)。 设备引用的最大MFLOPS是理论上的最大值,由于以下因素的组合,在用户代码中不可能实现:

    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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    2746 MFLOPS号码看起来像打字错误。 它应为456MHz * 6FLOP/CYC = 2736MFLOPS。 我以前从未注意到这一错误,但这对您的问题并不重要。

    您在测试中测量的是程序实施性能,而不是原始处理器基准测试。 但是,您所测量的是一个更真实的数字,因为程序和算法的性能是真正重要的。

    加上切斯特的项目A),.L单位和.S单位也可以执行浮点运算,因此使用8个功能单位的总数是他为每对.M,.L和.S单位引用的912个数字,总计2736个。

    Chester的基准可以帮助您了解如何实现应用程序的最佳性能。 目前,您甚至可能没有使用编译器优化或其他算法优化。

    2736是代码中的目标。 您不会超过该数量,但在切斯特列出的项目中,您可以看到可能存在的其他系统限制。 这是一种培养编写优化DSP代码熟练程度的有用技能,因此请继续学习这些技能,以获得持续成功。

    此致,
    RandyP
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如何同时使用M1.m2的功能单元?我在“Assmbly”窗口中发现M1.m2单元每a=b*c就只能使用一个;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如何同时使用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)缓冲器的信息,这些信息可能有助于了解如何最大限度地提高性能。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有关优化技术的更多信息,请访问TI.com并搜索"C6000优化"(无引号),以查找您可以通读的一些文章和存档培训课程。

    请参阅TI提供的库,以实现产品所需算法的组件。 这些库的函数已在C语言中优化或在汇编中手工编写,以实现最佳性能。 您可以研究这些实现方法来学习好的技术。

    此致,
    RandyP
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的帮助。我非常感谢您的帮助。是否有其它方法可以并行处理.M1和.M2?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您能告诉我一些网站或.pdf库吗?我

    如果我 使.M1和.M2单位并行,速度将翻倍?

    请告诉我如何在5.5 中使单位并行。

    我阅读了《TMS320C674x DSP  CPU和指令集 参考指南》,并想知道如何完成 并行操作?

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对不起,我不能确定上面提出了什么问题。 红色突出显示在我的计算机屏幕上是不可读的,至少对我的老眼睛来说是这样。

    我在解释如何编写并行指令方面做得比《CPU和指令集参考指南》更好。

    请转至我之前提到的培训材料,以找到所需的说明,指针,示例和指导。 您还可以搜索"C6748培训"或"C6748研讨会"(无报价)以查找更多基本的编程和应用培训。

    此致,
    RandyP