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.

[参考译文] CCS/TDA4VM:MMALIB_LINALG_matrixTranspose 计算错误

Guru**** 3003130 points

Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/915786/ccs-tda4vm-mmalib_linalg_matrixtranspose-calculation-error

器件型号:TDA4VM
Thread 中讨论的其他器件:SYSBIOS

工具/软件:Code Composer Studio

您好!

我在 mmalib 中使用 MMALIB_LINALG_matrixTranspose 接口、我的 PSDK 版本为06_02_00_21。

以下是我的代码

静态空 matTrans (int* out、int* in、int M、int N){
MMALIB_BufParams2D_t aBuffer;
a Buffer.data_type = MMALIB_Int32;
aBuffer.DIM_x = N;
aBuffer.DIM_y = M;
aBuffer.broad_y = aBuffer.dim_x * MMALIB_sizeof (aBuffer.data_type);

MMALIB_BufParams2D_t bBuffer;
bBuffer.data_type = MMALIB_Int32;
bBuffer.DIM_x = M;
bBuffer.DIM_y = N;
bBuffer.brob_y = bBuffer.dim_x * MMALIB_sizeof (bBuffer.data_type);

MMALIB_LINALG_matrixTranspose_Ixx_oxX_InitArgs initArgs;

//initArgs.funcStyle = MMALIB_Function_NATC;
initArgs.funcStyle = MMALIB_function_optimized;

int32_t handleSize = MMALIB_LINALG_matrixTranspose_Ixx_oxX_getHandleSize (&initArgs);
MMALIB_kernelHandle kernelHandle = malloc (handleSize);

//检查参数是否会生成有效的句柄
MMALIB_STATUS initCheck = MMALIB_LINALG_matrixTranspose_Ixx_oxX_init_checkParams (kernelHandle、
aBuffer (&A)、
bBuffer (&B 缓冲区)、
initArgs);

printf ("Init check =%d.\n"、initCheck);

//生成句柄
MMALIB_STATUS initStatus = MMALIB_LINALG_matrixTranspose_Ixx_oxX_init (kernelHandle、&aBuffer、&bBuffer、&initArgs);
printf ("Init status =%d.\n"、initStatus);

//检查 execute 参数是否可用于执行
MMALIB_STATUS execCheck = MMALIB_LINALG_matrixTranspose_Ixx_oxX_exec_checkParams (kernelHandle、
在中、
输出);
printf ("Exec check =%d.\n"、execCheck);

//执行内核
MMALIB_STATUS execStatus = MMALIB_LINALG_matrixTranspose_Ixx_oxX_exec (kernelHandle、
在中、
输出);

printf ("Exec status =%d.\n"、execStatus);

printf ("MatMulIntrinsics Done……\n");
FREE(kernelHandle);
}

int main(){

int m、n;
int M = 4;
INT N = 4;

int Mata[16]={0、1、2、3、
4、5、6、7、
8、9、10、11、
12、13、14、15 };
int matB[16]={0};

MatTrans (&matB[0]、Mata[0]、M、N);

printf ("matB =\n");
对于(m = 0;m < M;m++)
{
对于(n = 0;n < N;n++)
{
printf ("%d "、matB[ m*N + n]);
}
printf ("\n");
}
返回0;
} 

如果 funcStyle 参数是 MMALIB_Function_NATC,结果是正确的

[C7x_1 ] 25.874141 s:初始化检查= 0。
[C7x_1 ] 25.874162 s:初始化状态= 0。
[C7x_1 ] 25.874178 s:执行检查= 0。
[C7x_1 ] 25.874195 s:执行状态= 0。
[C7x_1 ] 25.874212 s:MatMulintrinsics 完成...
[C7x_1 ] 25.874226 s:matB =
[C7x_1 ] 25.874242 s:0 4 8 12.
[C7x_1 ] 25.874256 s:1 5 9 13.
[C7x_1 ] 25.874271秒:2 6 10 14
[C7x_1 ] 25.874286 s:3 7 11 15.

当 funcStyle 参数设置为 MMALIB_function_optimized 时,结果如下

[C7x_1 ] 32.679648 s:初始化检查= 0。
[C7x_1 ] 32.679671 s:初始化状态= 0。
[C7x_1 ] 32.679687 s:执行检查= 0。
[C7x_1 ] 32.679705 s:执行状态= 0。
[C7x_1 ] 32.679723 s:MatMulintrinsics 完成...
[C7x_1 ] 32.679738 s:matB =
[C7x_1 ] 32.679754 s:0 0 0 0
[C7x_1 ] 32.679771 s:0 0 0 0
[C7x_1 ] 32.679785 s:0 0 0 0
[C7x_1 ] 32.679800 s:0 0 0 0

我应该如何解决这个问题?

此致、

Henry

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

    您好、Henry、

     matrixTranspose 实现的 MMALIB_FUNCING_OPENized 变体使用内部缓冲区进行计算。 这个内部缓冲器被分配到段.l2dmemory。 此段.l2dmemory 必须映射到链接器命令文件中的有效 L2存储器区域。 您是否会仔细检查链接器命令文件是否正确映射了此段?

    谢谢、

    Sandeep

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

    您好 Sandeep,

    这是链接命令文件吗?

    vision_apps\apps\basic_demos\app_tirtos\tirtos_linux\c7x_1\linker_mem_map

    存储器
    {
    对于 C7x_1,// L2 [大小480.00 KB ]*/
    L2RAM_C7x_1 ( RWIX ):origin = 0x64800000,length = 0x00078000
    对于 C7x_1,// L1 [大小为16.00 KB ]*/
    L1RAM_C7x_1 (RWIX):origin = 0x64E00000,length = 0x00004000
    //针对 C7x_1的 MSMC [大小7.78MB ]*/
    MSMC_C7x_1 ( RWIX ):origin = 0x70020000,length = 0x007C8000
    对于 Linux IPC,用于 C7x_1的/* DDR [大小1024.00KB ]*/
    DDR_C7x_1_IPC (RWIX):origin = 0xA8000000,length = 0x00100000
    /* DDR for C7x_1 for Linux 资源表[大小1024 B ]*/
    DDR_C7x_1_resource_table (RWIX):origin = 0xA8100000,length = 0x00000400
    针对引导部分[大小1024 B ]的针对 C7x_1的/* DDR *
    DDR_C7x_1_boot (RWIX):origin = 0xA8200000,length = 0x00000400
    对于矢量部分,//针对 C7x_1的 DDR [大小为16.00 KB ]*/
    DDR_C7x_1_VECS ( RWIX ):origin = 0xA8400000,length = 0x00004000
    /* DDR for C7x_1 for secure vecs section [大小为16.00 KB ]*/
    DDR_C7x_1_SECURE_VECS ( RWIX ):origin = 0xA8600000,length = 0x00004000
    针对代码/数据的针对 C7x_1的/* DDR [大小9.98MB ]*/
    DDR_C7x_1 (RWIX):origin = 0xA8604000,length = 0x009FC000
    /* IPC vring 的内存。 必须是非高速缓存或高速缓存一致性[大小32.00 MB ]*/
    IPC_VING_MEM:origin = 0xAA000000,length = 0x02000000
    /*用于远程内核日志记录的内存[大小256.00 KB ]*/
    APP_LOG_MEM:origin = 0xAC000000,length = 0x00040000
    /* TI OpenVX 共享存储器的存储器。 必须是非高速缓存或高速缓存一致[大小31.62 MB ]*/
    TIOxv_obj_Desc_MEM:origin = 0xAC040000,length = 0x01FA0000
    /* DDR 中共享内存缓冲区的内存[大小512.00 MB ]*/
    DDR_Shared_MEM:origin = 0xAE000000,length = 0x20000000
    针对本地堆的 c7x_1的/* DDR [大小256.00 MB ]*/
    DDR_C7X_1_LOCAL_HEAP ( RWIX ):origin = 0xDC000000,length = 0x10000000
    对于暂存存储器,// c7x_1的 DDR [大小为240.00 MB ]*/
    DDR_C7X_1_Scratch ( RWIX ):origin = 0xEC000000,length = 0x0F000000
    }

    可以帮助我检查链接命令文件吗?

    谢谢、

    Henry

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

    您好、Henry、

    感谢您提供地图文件的部分。

    我在查找.l2dmemory 段在内存中的映射位置。 如果您能够在映射文件中搜索.l2dmemory 或 MMALIB_LINALG_matrixTranspose_i32s_o32s_IdentityBlock、则可以提供映射地址。

    此外、您是否会在调用 MMALIB_LINALG_matrixTranssUSE_Ixx_oxX_exec()函数之前整合以下代码(或类似代码)、并将打印的输出转储到文件中并提供文件以供进一步调试?


    printf ("身份块地址:%d\n"、(int32_t)&MMALIB_LINALG_matrixTranspose_i32s_o32s_IdentityBlock[0]);



    printf ("身份块的内容:\n");

    对于(i = 0;i < 16;i++){

       对于(j = 0;j < 16;j++){

            printf ("%d、"、MMALIB_LINALG_matrixTranspose_i32s_o32s_IdentityBlock[i*16+j]);

       }

       printf ("\n");

    }

    printf ("识别块内容的末尾\n");



    printf ("句柄的内容:\n");

    对于(i = 0;i < handleSize/sizeof (int32_t);i++){

        printf ("%d、"、*((((int32_t *) kernelHandle)+I))

    }

    printf ("句柄结束内容\n");


    谢谢、

    Sandeep

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

    您好、Sandeep

    我注意到在编译应用程序时出现警告。

    警告:创建不带 SECTIONS 规范的输出段".l2dmemory"

    这是问题的原因吗?

    如何解决?

    谢谢、

    Henry

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

    您好、Henry、

    实际上、我怀疑.l2dmemory 错误放置是问题的根源。

    当您构建可执行文件时、您将使用链接器命令文件(.cmd 扩展名)进行链接。 在此链接器命令文件中、.l2dmemory 必须分配给有效的 L2存储器部分。

    您可以在 ti\mmalib\concerto \C71\文件夹中找到名为 lnk.cmd 的示例链接器命令文件。 您可以搜索该行  

    .l2dmemory       > L2SRAM

    该文件中。 您可以在自己的链接器命令文件中使用类似的行。

    谢谢、

    Sandeep

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

    您好、Sandeep

    这是我的链接器命令文件。

    -c
    堆0x20000
    -stack 0x20000
    -e _c_int00_secure


    部分
    {

    vecs > DDR_C7x_1_VECS 对齐(0x200000)
    .SECURE_VECs > DDR_C7x_1_SECURE_VECS 对齐(0x200000)
    .text:_c_int00_secure > DDR_C7x_1_boot align (0x200000)
    .text > DDR_C7x_1

    .bss > DDR_C7x_1 //零初始化数据*/
    .data > DDR_C7x_1 /*已初始化数据*/

    .cinit > DDR_C7x_1 /*可以是 const 的一部分*/
    init_array > DDR_C7x_1 /* C++初始化*/
    .stack > DDR_C7x_1 align (0x20000)/*必须是128KB 对齐以处理嵌套中断*
    .args > DDR_C7x_1
    .cio > DDR_C7x_1
    .const > DDR_C7x_1
    .switch > DDR_C7x_1
    .sysmem > DDR_C7x_1 /*堆*/

    /*.bss:taskStackSection:tiovx (NoLoad):{}> L2RAM_C7x_1 */
    .bss:taskStackSection > DDR_C7x_1
    .bss:DDR_shared_mem (空载):{}> DDR_C7X_1_LOCAL_HEAP
    .bss:DDR_Scratch_mem (空载):{}> DDR_C7X_1_Scratch

    .bss:app_log_mem (空载):{}> app_log_mem
    .bss:tiovx_obj_desc_mem (空载):{}> TIOx_obj_Desc_MEM
    .bss:ipc_vring_mem (空载):{}> IPC_VING_MEM

    .bss:l1mem (空载)(NOINIT):{}> L1RAM_C7x_1
    .bss:l2mem (空载)(NOINIT):{}> L2RAM_C7x_1
    /*.l2dmemory > L2RAM_C7x_1*/
    .bss:l3mem (空载)(NOINIT):{}> MSMC_C7x_1

    .resource_table > DDR_C7x_1_resource_table

    组:> DDR_C7x_1
    {
    data.ti_sysbios_family_c7x_MMU_tableArray:type=NOINIT
    data.ti_sysbios_family_c7x_MMU_tableArraySlot:type=NOINIT
    data.ti_sysbios_family_c7x_MMU_level1表:type=NOINIT

    data.ti_sysbios_family_c7x_MMU_tableArray_NS:type=NOINIT
    data.ti_sysbios_family_c7x_MMU_tableArraySlot_NS:type=NOINIT
    data.ti_sysbios_family_c7x_MMU_level1Table_NS:type=NOINIT

    }


    }

    当我添加此行代码[.l2dmemory   >  L2RAM_C7x_1 ]时、我收到以下错误。

    程序不能放入可用的存储器中、或者该段包含调用
    需要无法为此段生成的 trampoline 的站点。
    ".l2dmemory"大小为0x1c00时、运行定位失败。
    可用存储器范围:
    L2RAM_C7x_1大小:0x78000未使用:0x0最大空洞:0x0

    可以帮助我修改此文件吗?

    谢谢、

    Henry

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

    您好、Henry、

    ti/mmalib/concerto/C71/lnk.cmd 中提供了一个示例链接器命令文件、供您构建 MMALIB。

    要生成示例测试构建、请使用用户指南中给出的构建说明。

    谢谢、

    Sandeep