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.

[参考译文] TDA4VH-Q1:关于 c7x 编译器:编译器生成汇编文件的方式。

Guru**** 2445440 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1546398/tda4vh-q1-about-the-c7x-compiler-the-way-the-compiler-generate-the-assembly-file

器件型号:TDA4VH-Q1


工具/软件:

大家好、我遇到了编译器如何生成.asm 文件的问题。 目前、我使用了一些简单的代码片段 c7x 代码。 我的代码包括一些 for 循环。 当我使用 C7x_code_samples 构建此文件并生成.asm 时。 我不知道我的代码在哪里被转换为 ASM?
这里是我的代码片段:(如果代码是如此的漫不经心阅读,请随时告诉我,我可以发送一些图像给你们)
静态 void full_connected_c (
const int8_t*输入、
const int8_t*权重、
int8_t*输出、
INT INPUT_CHANNES、
INT OUTPUT_CHANNES、
int32_t 偏置[]、
int32_t 移位)

对于 (int oc = 0;oc < output_channels;oc++){
int32_t sum = bias[oc]? 偏差[oc]:0;
//std::cout <<“Sum-bias:“<< sum << std::endl;
对于 (int ic = 0;ic < input_channels;ic++){
SUM +=输入[IC]*权重[oc * INPUT_CHANNES + IC];
}
//std::cout <<“输出前[“<< oc <<“]:“<<总和<< std::endl;
SUM =(SUM +(1 <<(SHIFT - 1)))>> SHIFT;

std::cout <<“output["<<“<< oc <<“]:“<< std::max (std::min (sum、127)、–128)<< std:::endl;
Output[oc]=(int8_t) std::max (std::min (sum、127)、–128);
}
}


因此在.asm 文件中、im tryin 找出指令集的 full_connected_c 函数实现的位置。 (我以上所做的一切都是为了了解编译器如何处理循环展开因子)
还有一件事、如果你们有任何关于编译阶段、调试等的文档、那就好了。

Tks、
Khoi

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

    尊敬的 Khoi:

    是否使用 CCS 构建代码? 如果是、请启用以下选项。 编译完成后、您会在 debug/release 文件夹中找到.asm 文件?

    参考屏幕截图:

     

    我能够使用您的代码生成.asm 文件。

    还有一件事、如果你们有任何关于编译阶段、调试等的文档、那就好了。

    参考文档的链接: https://www.ti.com/lit/ug/spruig8g/spruig8g.pdf

    此致、

    Betsy Varughese.

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

    啊、不 Im 不使用 IDE 来编译源代码、我只使用带有原始源代码的编译系统。 当然、我可以生成.asm 文件。  
    但我的重点是、   指令集的函数实现在哪里、 编译器如何处理循环展开因子。

    此致、
    Khoi

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

    尊敬的 Khoi:

    Im 未使用 IDE 构建源代码、我只是使用带有原始源代码的构建系统

    这也没关系。

    其中是 指令集的函数实现、 编译器如何处理循环展开因子。

    下面是我随您的代码生成的.asm。 您能看看这个吗?

    e2e.ti.com/.../sample.asm

    此致、

    Betsy Varughese.

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

    尊敬的 Besty:
    哦,这是合理的,你能给你的编译标志和你得到它的方式吗?
    我看到调试是 DWARF 格式、但我无法跟踪这些 asm 代码片段代码属于我 C 代码的哪个部分。
    e2e.ti.com/.../c7x_5F00_snippet.asm
    上面是我的编译后 asm、我对如何从这个编译中提取一些有用的数据感到困惑...  

    Bests,
    Khoi

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

    尊敬的 Khoi:

    哦、这是合理的、你能给你的编译标记和你得到它的方法吗?

    我将共享代码片段以及用于构建代码片段的编译标志。

    "C:/tiC7xcgt/ti-cgt-c7000_4.1.0.LTS/bin/cl7x" -mv7120 -O2 --include_path="C:/CCS_Workspace/hello_test" --include_path="C:/tiC7xcgt/ti-cgt-c7000_4.1.0.LTS/include" --advice:performance=all -g --diag_warning=225 --diag_wrap=off --display_error_number --no_warnings -k --preproc_with_compile --preproc_dependency="sample.d_raw"  "../sample.cpp"

    注意:我使用 CCS IDE 构建代码。

    此致、

    Betsy Varughese.

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

    您好 Betsy、
    感谢您的 信息。
    现在,我可以生成一些类似人类可读的 ASM :D ,但在上面我刚刚发送给你的文件。 您能看一下吗、这是我想解决的另一件事。

    Bests,
    Khoi

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

    尊敬的 Khoi:

    您能看一下吗、这是我想解决的另一件事。
    [/报价]

    当然、我可以帮助了解.asm 文件。 您能告诉我您使用的优化级别吗? 此外、如果您可以共享相应的源代码、我将能够将其与.asm 输出交叉校验。

    通过我这边的快速检查、  

    下面的行表示函数 full_connecte_c7x 的起始位置

    从 239 行开始的循环是软件流水线循环、ii 为 10。 此信息下方列出了循环内使用的指令。  

    我建议参考 优化指南的第 2.3 节、该节详细说明了上述所有要点。

    此致、

    Betsy Varughese.

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

    您好 Betsy、

    在使用这些编译标志生成后

    --opt_level=3 --debug_software_pipeline --advice:performance=all --diag_warning=25 --diag_wrap=off --c_src_interlist --symdebug:dwarf c7x_snippet.cpp

    我得到了这个文件、可以检查这个:e2e.ti.com/.../6740.c7x_5F00_snippet.asm
    但我添加了-c_src_interlist。 但下面的代码片段(我看不到它转换后的汇编代码):

    ; 243 |             //Read a vector of 32-16b elements from input              
    ; 244 |             char_vec vInput = *(char_vec *)(pInA + itr);               
    ; 246 |             char_vec vWeights00 = *(char_vec *)(pWt00 + itr);          
    ; 247 |             char_vec vWeights01 = *(char_vec *)(pWt01 + itr);          
    ; 248 |             char_vec vWeights02 = *(char_vec *)(pWt02 + itr);          
    ; 249 |             char_vec vWeights03 = *(char_vec *)(pWt03 + itr);          
    ; 251 |             short_vec vInput_Hi   = __unpack_high(vInput);             
    ; 252 |             short_vec vInput_Lo   = __unpack_low(vInput);              
    ;----------------------------------------------------------------------
               LDW     .D1     *SP(48),B0        ; [A_D1] |195| 
    $C$DW$733	.dwtag  DW_TAG_TI_branch
    	.dwattr $C$DW$733, DW_AT_low_pc(0x00)
    	.dwattr $C$DW$733, DW_AT_name("_ZNSt3__213basic_ostreamIcNS_11char_traitsIcEEElsEi")
    	.dwattr $C$DW$733, DW_AT_TI_call
    
    
               CALL    .B1     ||_ZNSt3__213basic_ostreamIcNS_11char_traitsIcEEElsEi|| ; [A_B] |195| 
    ||         MV      .L1X    B0,A5             ; [A_L1] |195| 
    
    $C$RL26:   ; CALL OCCURS (||_ZNSt3__213basic_ostreamIcNS_11char_traitsIcEEElsEi||) arg:{A4,A5} ret:{A4}  ; [] |195| 
    $C$DW$734	.dwtag  DW_TAG_TI_branch
    	.dwattr $C$DW$734, DW_AT_low_pc(0x00)
    	.dwattr $C$DW$734, DW_AT_name("_ZNSt3__24endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_")
    	.dwattr $C$DW$734, DW_AT_TI_call
    
               CALL    .B1     ||_ZNSt3__24endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_|| ; [A_B] |195| 
    $C$RL27:   ; CALL OCCURS (||_ZNSt3__24endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_||) arg:{A4} ret:{}  ; [] |195| 
    	.dwpsn	file "/home/kyuubi/work/ti_docs/ti-processor-sdk-rtos-j784s4-evm-10_01_00_04/ti-cgt-c7000_4.1.0.LTS/include/string.h",line 254,column 18,is_stmt,isa 0
    ;----------------------------------------------------------------------



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

    尊敬的 Khoi:

    是的、我注意到优化级别= 3 的问题。 我会检查并告诉您。

    您可以尝试使用优化级别= 2(例如,--opt_level=2) 吗?

    此致、

    Betsy Varughese.

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

    您好 Betsy、

    好的 、我已经尝试使用--opt_level=2 进行编译。 这里是输出 asm:
    e2e.ti.com/.../7041.c7x_5F00_snippet.asm

    Bests,
    Khoi

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

    尊敬的 Khoi:

    对于 -opt_level=3、启用所有-O2 优化以及激进的内联、循环展开和矢量化。 如果未显式标记、则可以将小型或中型函数完全内联或从独立的.asm 文件中删除。

    在本例中、函数被定义为 static。 因此、在这种情况下、 编译器可以自由内联并将其删除、除非您将其标记为__attribute__((noinline))。

    您可以尝试以下方法吗:

    __attribute__((noinline))
    void fully_connected_c(const int8_t* input, const int8_t* weights, int8_t* output, int input_channels, int output_channels, int32_t bias[], int32_t shift)
    {
        for (int oc = 0; oc < output_channels; oc++) {
            int32_t sum = bias[oc] ? bias[oc] : 0;
            //std::cout << "Sum-bias: " << sum << std::endl;
            for (int ic = 0; ic < input_channels; ic++) {
                sum += input[ic] * weights[oc * input_channels + ic];
            }
            //std::cout << "before output[" << oc << "] : " << sum << std::endl;
            sum = (sum + (1 << (shift - 1))) >> shift;
    
            //std::cout << "output[" << oc << "] : " << std::max(std::min(sum, 127), -128) << std::endl;
            output[oc] = (int8_t)std::max(std::min(sum, 127), -128);
        }
    }

    此致、

    Betsy Varughese.

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

    您好 Betsy、  
    现在一切都好。 但我对.asm 文件中的展开因子还有 1 个问题? 你能为我解释这一点, Comiler 可以知道的方式 1 片段与确定的展开因子? 它管理这些参数的方式是什么?
    并在使用两个不同的片段代码生成.asm 时执行增益。 它生成相同的展开因子。

     Loop found in file               : c7x_snippet.cpp
    ;*      Loop source line                 : 188
    ;*      Loop opening brace source line   : 188
    ;*      Loop closing brace source line   : 190
    ;*      Loop Unroll Multiple             : 32x
    ;*      Known Minimum Iteration Count    : 1                    
    ;*      Known Max Iteration Count Factor : 1
    ;*      Loop Carried Dependency Bound(^) : 1
    ;*      Unpartitioned Resource Bound     : 33
    ;*      Partitioned Resource Bound       : 33 (pre-sched)


    Bests,
    Khoi

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

    尊敬的 Khoi:

    下面是对所提供.asm 的说明、

     Loop found in file               : c7x_snippet.cpp
    ;*      Loop source line                 : 188
    ;*      Loop opening brace source line   : 188
    ;*      Loop closing brace source line   : 190
    ;*      Loop Unroll Multiple             : 32x
    ;*      Known Minimum Iteration Count    : 1                    
    ;*      Known Max Iteration Count Factor : 1
    ;*      Loop Carried Dependency Bound(^) : 1
    ;*      Unpartitioned Resource Bound     : 33
    ;*      Partitioned Resource Bound       : 33 (pre-sched)

    编译器优化了文件中的循环 c7x_snippet.cpp 。 循环从源代码中的第 188 行开始、到第 190 行结束。  

    循环展开倍数:32x “ :编译器将此循环展开一个因子 32、因此对于编译的汇编中的每次迭代、它都会从原始循环执行 32 次操作。

    我在下面提到的文件中提供了详细的解释(请参阅第 4 章)

    cuz 当我使用两个不同的代码片段生成.asm 时。 它生成相同的展开因子。

    是的、两个循环都具有类似的优化特性、例如循环携带依赖、寄存器使用、指令计数/迭代和循环计数等

    参考文档: http://ti.com/lit/ug/spruiv4d/spruiv4d.pdf

    此致、

    Betsy Varughese.

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

    您好、
    为您提供信息
    我现在可以自己去做。