工具/软件:
您好 TI、
为了评估 C7x 的性能、我首先在 CCS 上实现了自己的 FIR 算法、并收集了运行此代码时生成的 MAC 运算数量。
然后、我的目标是使用 TI 提供的代码在 CCS 工程中实现 FIR 算法。 为此、我尝试使用与相同的代码 DSPLIB_fir_example.cpp 然而,它失败了。 问题是我的编译器找不到 dsplib.h 软件库。
是否有人知道如何解决此问题?
此致、
M é lanie
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、
为了评估 C7x 的性能、我首先在 CCS 上实现了自己的 FIR 算法、并收集了运行此代码时生成的 MAC 运算数量。
然后、我的目标是使用 TI 提供的代码在 CCS 工程中实现 FIR 算法。 为此、我尝试使用与相同的代码 DSPLIB_fir_example.cpp 然而,它失败了。 问题是我的编译器找不到 dsplib.h 软件库。
是否有人知道如何解决此问题?
此致、
M é lanie
您好、
问题是我的编译器找不到 dsplib.h 库。
您是否可以将 DSPLIB_C7120.lib 从 工程属性中的路径“ti-processor-sdk-rtos-j784s4-evm-10_01_00_04/DSPLIB/lib/Release/"添加“添加到 C7000 链接器设置下的文件搜索路径中。
此外、您是否可以将路径“ti-processor-sdk-rtos-j784s4-evm-10_01_00_04/DSPLIB/DSPLIB"添加“添加到工程的 Include src 中。
进行这些更改后、请尝试编译工程。
此致、
Shabary
我尝试实施 DSPLIB_fir_example.cpp 在 CCS 上:
/** * main.cpp */ #include "dsplib.h" #include <stdint.h> int main(void){ /* --- Vecteurs d entree - sortie du filtre FIR --- */ /* x(t) : vecteur de complexe en entree */ //pour le moment on ut vect passe par TI float in[] = {0.0075269, 0.42490765, 0.5737673, 0.2208442, 0.09775102, 0.24138574, 0.04012135, 0.74615402, 0.08575411, 0.02825585, 0.0394516, 0.53011919, 0.8855483, 0.64490047, 0.43757865, 0.9008144, 0.88742952, 0.5273014, 0.15618296, 0.2486165, 0.73751811, 0.80145564, 0.00925736, 0.61880944, 0.01848634, 0.78157248, 0.29912587, 0.34630224, 0.28394529, 0.16470226, 0.03790734, 0.05151005, 0.93717938, 0.93691852, 0.85173587, 0.99901312, 0.72999805, 0.07310897, 0.68994449, 0.80322511, 0.59070248, 0.52609875, 0.8837833, 0.43461102, 0.29789329, 0.8795983, 0.08831519, 0.25615793, 0.57545443, 0.76529679, 0.7559087, 0.60065098, 0.93648813, 0.9509784, 0.33040872, 0.07305676, 0.79920768, 0.03319901, 0.90727184, 0.59441656, 0.42762858, 0.92020711, 0.80031864, 0.01848634}; /* h(t) : vecteur coefficients filtre FIR */ float filter[] = {0.68517633, 0.62932418, 0.40943144, 0.83713068, 0.32060292, 0.92259115, 0.96543234, 0.63864105, 0.82545659, 0.20080124, 0.85765419, 0.21333606, 0.04969507, 0.87302331, 0.13975056, 0.94914013, 0.97427525, 0.18113375, 0.65753913, 0.64872713, 0.65282617, 0.81546733, 0.22026294, 0.85940409, 0.21061344, 0.31353881, 0.27924398, 0.53946946, 0.86391542, 0.94781037, 0.73137234, 0.01975425}; /* y(t)*/ float out[] = { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,}; /* Tailles des @ du filtre FIR */ uint32_t dataSize = 64; //x(t) contient 64 elements // in bytes uint32_t dataPitchInSize = 64 * 4; //taille x(t) en bytes // in bytes uint32_t dataPitchOutSize = 64 * 4; uint32_t batchSize = 1; uint32_t filterSize = 32; // float data type uint32_t shift = 1; /* --- Caracteristiques du kernel --- */ DSPLIB_STATUS status; DSPLIB_fir_InitArgs kerInitArgs; int32_t handleSize = DSPLIB_fir_getHandleSize(&kerInitArgs); DSPLIB_kernelHandle handle = malloc(handleSize); /* Types des buffers d entree et sortie */ DSPLIB_bufParams2D_t bufParamsIn, bufParamsOut; DSPLIB_bufParams1D_t bufParamsFilter; /* Remplissages des buffers avec les valeurs des vecteurs */ /* Buffer contenant x(t) */ bufParamsIn.data_type = DSPLIB_FLOAT32; bufParamsIn.dim_x = dataSize; bufParamsIn.stride_y = dataPitchInSize; bufParamsIn.dim_y = batchSize; /* Buffer contenant y(t) */ bufParamsOut.data_type = DSPLIB_FLOAT32; bufParamsOut.dim_x = dataSize; bufParamsOut.stride_y = dataPitchOutSize; bufParamsOut.dim_y = batchSize; /* Buffer contenant h(t) */ bufParamsFilter.data_type = DSPLIB_FLOAT32; bufParamsFilter.dim_x = filterSize; /* Remplissage des champs de la structure des @ du kernel */ kerInitArgs.dataSize = dataSize; kerInitArgs.batchSize = batchSize; kerInitArgs.filterSize = filterSize; kerInitArgs.shift = shift; kerInitArgs.funcStyle = DSPLIB_FUNCTION_OPTIMIZED; //indicateur d'optimisation /* Statut initial de l algo */ status = DSPLIB_SUCCESS; /* --- Initialisation de l'algo FIR */ if (status == DSPLIB_SUCCESS){ status = DSPLIB_fir_init(handle, &bufParamsIn, &bufParamsFilter, &bufParamsOut, &kerInitArgs); } return 0; }
但是、 编译时出现错误消息:
"../main.cpp", line 94: error #169: argument of type "DSPLIB_bufParams1D_t *" is incompatible with parameter of type "DSPLIB_bufParams2D_t *"
您好 、M é lanie、
1.“DSPLIB_bufParams1D_t bufParamsFilter;“(行号:60)应为 DSPLIB_bufParams2D_t bufParamsFilter;(请参见 DSPLIB_fir.cpp 中 DSPLIB_fir_init () 的函数定义、行号:139)
2.按如下方式设置滤波器系数参数:
另外,我还在解决另一个问题:
为了评估 C7X DSP 在执行时间方面的性能、我希望在中编译/运行代码 realease 模式 。 但是,每当我尝试这样做时,它会生成编译失败,并显示以下错误消息:
>> Compilation failure subdir_rules.mk:9: recipe for target 'DSPLIB_fir.obj' failed "../DSPLIB_fir.cpp", line 23: fatal error #1965: cannot open source file "DSPLIB_fir/DSPLIB_fir_priv.h" 1 catastrophic error detected in the compilation of "../DSPLIB_fir.cpp". Compilation terminated. gmake: *** [DSPLIB_fir.obj] Error 1 Building file: "../main.cpp" Invoking: C7000 Compiler "C:/Users/MyApp/Packages/ti-cgt-c7000_4.1.0.LTS/bin/cl7x" -O2 --include_path="C:/Users/MyApp/depots/stage_jacinto7/Benchmark Algo FIR" --include_path="C:/Users/MyApp/Packages/ti-cgt-c7000_4.1.0.LTS/include" --diag_warning=225 --diag_wrap=off --display_error_number --preproc_with_compile --preproc_dependency="main.d_raw" "../main.cpp" >> Compilation failure subdir_rules.mk:9: recipe for target 'main.obj' failed "..\dsplib.h", line 37: fatal error #1965: cannot open source file "DSPLIB_add/DSPLIB_add.h" 1 catastrophic error detected in the compilation of "../main.cpp". Compilation terminated. gmake: *** [main.obj] Error 1 gmake: Target 'all' not remade because of errors.
我添加了我进去时的所有包含/链接器路径和库 调试模式 (每次创建工程时默认模式)。 当我尝试在调试模式下编译时、它是有效的。 然而,我注意到,当我切换在释放模式时,我添加的所有路径都消失了,这是正常的吗?
您好、
[引述 userid=“647126" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1516996/tda4vm-running-dsplib_fir-codes-from-ti-on-dsp-c7x-on-ccs/5839633 #5839633“] 然而,我注意到,当我切换在释放模式时,我添加的所有路径都消失了,这是正常的吗? [/报价]是的、这是预期行为。
调试/发布配置具有自己的一组编译器/链接器设置。 因此、如果您在“Debug"下“下添加路径/库、它们只适用于该配置。 切换到“Release"时“时、CCS 使用为“Release"定义“定义的设置、该设置默认为最小值且与“Debug"无关“无关。
此致、
Shabary.
您好、
感谢您的解释
我尝试通过创建一个表示复数的结构来使用自定义参数:
#ifndef NOMBRE_COMPLEXE_HPP_ #define NOMBRE_COMPLEXE_HPP_ struct Complexe{ float re; //partie reelle d un nombre complexe float im; //partie imaginaire d un nombre complexe }; #endif /* NOMBRE_COMPLEXE_HPP_ *
但是、当我替换时 悬空 具有 A 的原始输入和输出的类型 复合类型 、FIR 算法的输出不正确。 因为我的复数类型是什么 8 字节 、我认为我需要对某些功能进行一些更改?
下面是用于 main.cpp 的代码、我在其中进行了一些更改:
/** * main.cpp */ #include "dsplib.h" #include <stdint.h> #include <iostream> #include "Nombre_complexe.hpp" using namespace std; int main(void){ /* --- Vecteurs d entree - sortie du filtre FIR --- */ /* Utilisation petits vecteurs */ /* x(t) : vecteur de complexe en entree, appele in(t) ici */ Complexe in[] = { {1.0, 1.0}, {-2.0,-1.0}, {0.0,1.0}, {-4.0,0.0} }; /* h(t) : vecteur coefficients filtre FIR */ float filter[] = {-1.0, 4.0, 1.0}; /* y(t)*/ /* Conformement au benchmark de TI, on met y(t) de meme taille que x(t) */ Complexe out[] = {{0.0, 0.0}, {0.0,0.0}, {0.0,0.0}, {0.0,0.0} }; /* Tailles des @ du filtre FIR */ uint32_t dataSize = 8; //x(t) contient 8 elements // in bytes uint32_t dataPitchInSize = 8 * 8; //taille x(t) en bytes, pour rappel pour notre architecture, 1 float = 4 octet et 1 Complexe = 8 octets // in bytes uint32_t dataPitchOutSize = 8 * 8; uint32_t batchSize = 1; uint32_t filterSize = 3; // float data type uint32_t shift = 1; //ajout pour compenser erreur DSPLIB_bufParams1D_t uint32_t dataPitchFilterSize = 3 * 4; //ajout pour compenser erreur DSPLIB_bufParams1D_t. Initialisation d'un @ prop par TI uint32_t filterPitch = 0; //cf fichier DSPLIB_fir_idat.c /* --- Caracteristiques du kernel --- */ DSPLIB_STATUS status; DSPLIB_fir_InitArgs kerInitArgs; int32_t handleSize = DSPLIB_fir_getHandleSize(&kerInitArgs); DSPLIB_kernelHandle handle = malloc(handleSize); /* Types des buffers d entree et sortie */ DSPLIB_bufParams2D_t bufParamsIn, bufParamsOut; // DSPLIB_bufParams1D_t bufParamsFilter; //modification car cree erreur DSPLIB_bufParams2D_t bufParamsFilter; /* Remplissages des buffers avec les valeurs des vecteurs */ /* Buffer contenant x(t) */ // bufParamsIn.data_type = DSPLIB_FLOAT32; bufParamsIn.data_type = DSPLIB_FLOAT64; //@ modif car on manip des complexes bufParamsIn.dim_x = dataSize; bufParamsIn.stride_y = dataPitchInSize; bufParamsIn.dim_y = batchSize; /* Buffer contenant y(t) */ // bufParamsOut.data_type = DSPLIB_FLOAT32; bufParamsIn.data_type = DSPLIB_FLOAT64; bufParamsOut.dim_x = dataSize; bufParamsOut.stride_y = dataPitchOutSize; bufParamsOut.dim_y = batchSize; /* Buffer contenant h(t) */ bufParamsFilter.data_type = DSPLIB_FLOAT32; bufParamsFilter.dim_x = filterSize; bufParamsFilter.stride_y = dataPitchFilterSize; bufParamsFilter.dim_y = batchSize; /* Remplissage des champs de la structure des @ du kernel */ kerInitArgs.dataSize = dataSize; kerInitArgs.batchSize = batchSize; kerInitArgs.filterSize = filterSize; kerInitArgs.shift = shift; kerInitArgs.funcStyle = DSPLIB_FUNCTION_OPTIMIZED; //indicateur d'optimisation /* Statut initial de l algo */ status = DSPLIB_SUCCESS; /* --- Initialisation de l'algo FIR */ if (status == DSPLIB_SUCCESS){ // status = DSPLIB_fir_init_checkParams(handle, &bufParamsIn, &bufParamsOut, &kerInitArgs); //modifie car erreur pour moi, manque un @ status = DSPLIB_fir_init_checkParams(handle, &bufParamsIn, &bufParamsOut, &bufParamsFilter, &kerInitArgs); } if (status == DSPLIB_SUCCESS){ status = DSPLIB_fir_init(handle, &bufParamsIn, &bufParamsFilter, &bufParamsOut, &kerInitArgs); } /* --- Execution de l'algo FIR --- */ if (status == DSPLIB_SUCCESS){ status = DSPLIB_fir_exec_checkParams(handle, in, filter, out); } if (status == DSPLIB_SUCCESS){ status = DSPLIB_fir_exec(handle, in, filter, out); } //boucle for avec un itérateur sur la taille du vecteur x(t) for (size_t c = 0; c < dataSize ; c++) { // printf("%10g (*) %10g = %10g\n", in[c], filter[c], out[c]); cout << (in[c]).re << " * " << filter[c] << "= " << (out[c]).re << endl; cout << (in[c]).im << " * " << filter[c] << "= " << (out[c]).im << endl; } return 0; }
此致、
M é lanie
您好、
您能否分享您在 Code Composer Studio (CCS) 中用于构建代码的链接器脚本?
您能否确认为什么 dataPitchInSize 和 dataPitchOutSize 设置为 8×8?
但是、当我替换时 悬空 具有 A 的原始输入和输出的类型 复合类型 、FIR 算法的输出不正确。 因为我的复数类型是什么 8 字节 、我认为我需要对某些功能进行一些更改? [/报价]我将在内部检查 API DSPLIB_FIR_exec (handle、in、filter、out) 是否适用于复数、或者是否有任何专门为复杂数据设计的替代 API。
此致、
Shabary.
您好、
当然,这里是:
/****************************************************************************/ /* --- ADAPTATION DU LINKER POUR CARTE JACINTO7 J721E --- */ /* */ /* --- MEMORY INTERFACES --- */ /* DDR MEMORY : 4GB of LPDDR4 */ /* MAPPING : mapped from 0x80000000 to 0x180000000 */ /* OPSI MEMORY : 512 Mbit */ /* UFS MEMORY : 32GB */ /* 2 MMC PORTS (MCC0 and MCC1) : MMC0 = connected to 16GB eMMC Flash */ /* MMC1 = interfaced with Micro SD Socket */ /* --- THE FOLLOWING ONES ARE OPTIONAL --- */ /* Hyper Flash = 512 Mb flash */ /* Hyper RAM = 64 Mb DRAM */ /* */ /* --- MEMORY LAYOUT OF DSP C7X --- */ /* */ /* L1 CACHE : */ /* L1 PRORAM MEMORY CONTROLLER (PMC) : 32KB L1P MEMORY */ /* L1 DATA MEMORY CONTROLLER (DMC) : 48KB L1D MEMORY */ /* - 32KB OF CACHE */ /* - 16KB OF SRAM */ /* L2 CACHE : */ /* L2 UNIFIED MEMORY CONTROLLER (UMC) : 512KB L2 MEMORY */ /* - 64KB OF CACHE */ /* - 448KB OF SRAM */ /* */ /* */ /* */ /****************************************************************************/ // On met les tailles de la stack et du segment de heap à 20MB ici car on manip on fichier au max de 3MB -stack 0x1400000 -heap 0x1400000 MEMORY { /*448KB of L2 SRAM */ L2SRAM_C7x_0 (RWIX) : org = 0x64800000, len = 0x70000 /*16KB of L1 DSRAM */ L1DSRAM_C7x_0 (RWIX) : org = 0x64E00000, len = 0x4000 /*7.78MB of MSMC */ MSMC_C7x_0 (RWIX) : org = 0x70020000, len = 0x7C7FFF //DDR_C7x_0 (RWIX) : org = 0xA0000000, len = 0x80000000 // attention : la taille mise pour 2MB est incorrecte,on a 264MB la /*64MB of DDR */ DDR_C7x_0 (RWIX) : org = 0xA0000000, len = 0x4000000 } SECTIONS { .ss_vectors > DDR_C7x_0 /*CONTAINS BINARY CODES */ .text > DDR_C7x_0 /*ENTRY POINT FOR THE PROGRAM EXECUTION */ /*BY DEFAULT IT IS NAMMED _c_init00 FOR C7x */ /*A VOIR MAIS JE PENSE UTILE QUE POUR BOOT */ .text:_c_init00: > DDR_C7x_0 /*CONTAINS DYNAMIC ALLOCATION/HEAP */ .sysmem > DDR_C7x_0 /*CONTAINS GLOBAL AND STATIC VARIABLES INITIALIZED */ .data > DDR_C7x_0 /*CONTAINS GLOBAL AND STATIC VARIABLES UNINITIALIZED */ .bss > DDR_C7x_0 /*CONTAINS LOCAL VARIABLES */ .stack > DDR_C7x_0 /*CONTAINS ARGC/ARGV */ .args > DDR_C7x_0 /*COULD BE PART OF CONST */ .cinit > DDR_C7x_0 /*C++ INITIALIZATION */ .init_array > DDR_C7x_0 /*ADDING SECTIONS CIO AND CONST AFTER 1ST BUILDING */ .cio > DDR_C7x_0 .const > DDR_C7x_0 /* BUFFER FROM DDR TO L1DSRAM */ .zone1_L1DSRAM > L1DSRAM_C7x_0 /* BUFFER FROM DDR TO L2SRAM */ .zone2_L2SRAM > L2SRAM_C7x_0 /* BUFFER FROM DDR TO MSMC */ .zone3_MSMC > MSMC_C7x_0 }
我不太理解您的第二个问题... 是的、如果您查看先前共享代码的第 40 行和第 42 行、则可以看到 dataPitchInSize 和 dataPitchOutSize 设置为 8×8。
好的、谢谢、让我及时更新
此致、
M é lanie
您好、
我不太理解您的第二个问题... 是的、如果您查看先前共享代码的第 40 行和第 42 行、您可以看到 dataPitchInSize 和 dataPitchOutSize 设置为 8×8。
您能否确认为什么 dataPitchInSize 和 dataPitchOutSize 设置为 8×8?
好的、谢谢您、让我更新一下、然后
DSPLIB 中的 FIR 滤波器未针对复数型输入进行优化。 这就是您获得错误结果的原因。
此致、
Shabary
您好、
“对不起,我不是第一次看到你。“ 我决定这样设置,因为有一个包含 8 个元素的数组,如果我总结每行中的所有元素:每行 2 个元素,有 4 行。 同样的推理也适用于其他 8 的列。 也许这不是正确的思维方式?
Complexe in[] = { {1.0, 1.0}, {-2.0,-1.0}, {0.0,1.0}, {-4.0,0.0} }; /* h(t) : vecteur coefficients filtre FIR */ float filter[] = {-1.0, 4.0, 1.0}; /* y(t)*/ /* Conformement au benchmark de TI, on met y(t) de meme taille que x(t) */ Complexe out[] = {{0.0, 0.0}, {0.0,0.0}, {0.0,0.0}, {0.0,0.0} };
关于在 DSPLIB 中使用 FIR 滤波器和复数类型、您说没有针对该类型进行优化。 但是、是否可以通过对 DSPLIB 代码进行一些更改来使用该类型? 我真的需要使用这种类型...
此致、
M é lanie
您好、
根据我在上一个答案中提到的输入和过滤器数组、您能否确认我的推理是否正确?
由于您使用的是复数数据类型、其中实部和虚部都存储为浮点数、因此每个复数占用:
- 4 字节 (real)+ 4 字节 (imag)=每个复数输入 8 个字节。
在您的案例中、有 4 个复杂输入、因此一个批次的总大小为:
- 4 个复数输入× 8 个字节= 32 个字节。
此致、
Shabary