工具/软件:
您好 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