Fftw3 库和计划重用
Fftw3 library and plans reuse
我即将在我的特定任务中使用 fftw3 库。
我有一个帧大小可变的重负载数据包流,它是这样产生的:
while(thereIsStillData){
copyDataToInputArray();
createFFTWPlan();
performExecution();
destroyPlan();
}
由于创建计划相当昂贵,我想将我的代码修改成这样:
while(thereIsStillData){
if(inputArraySizeDiffers()) destroyOldAndCreateNewPlan();
copyDataToInputArray(); // e.g. `memcpy` or `std::copy`;
performExecution();
}
我可以这样做吗?我的意思是,计划是否包含一些基于数据的重要信息,例如,为一个大小为 N
的数组创建的计划在执行时将为另一个大小相同的数组 N
提供不正确的结果。
fftw_execute()
函数不会修改提交给它的计划,可以用同一个计划多次调用。但是请注意,该计划包含指向输入和输出数组的指针,因此如果 copyDataToInputArray()
涉及创建不同的输入(或输出)数组,那么您之后不能使用 fftw_execute()
中的旧计划来转换新数据。
但是,FFTW 确实有一组“New-array Execute Functions”可以在这里提供帮助,假设新数组满足一些与旧数组相关的额外相似性标准(有关详细信息,请参阅链接文档)。
文档推荐:
If you are tempted to use the new-array execute interface because you want to transform a known bunch of arrays of the same size, you should probably go use the advanced interface instead
但那是在谈论转换同时在内存中并以规则方式排列的多个数组。
还要注意,如果您的可变帧大小不是 太可变的——也就是说,如果它始终是相对较少的选择之一——那么你可以考虑在内存中为每个帧大小保留一个单独的计划,而不是每次一个帧的大小与前一个帧的大小不同时重新计算计划。
我即将在我的特定任务中使用 fftw3 库。
我有一个帧大小可变的重负载数据包流,它是这样产生的:
while(thereIsStillData){
copyDataToInputArray();
createFFTWPlan();
performExecution();
destroyPlan();
}
由于创建计划相当昂贵,我想将我的代码修改成这样:
while(thereIsStillData){
if(inputArraySizeDiffers()) destroyOldAndCreateNewPlan();
copyDataToInputArray(); // e.g. `memcpy` or `std::copy`;
performExecution();
}
我可以这样做吗?我的意思是,计划是否包含一些基于数据的重要信息,例如,为一个大小为 N
的数组创建的计划在执行时将为另一个大小相同的数组 N
提供不正确的结果。
fftw_execute()
函数不会修改提交给它的计划,可以用同一个计划多次调用。但是请注意,该计划包含指向输入和输出数组的指针,因此如果 copyDataToInputArray()
涉及创建不同的输入(或输出)数组,那么您之后不能使用 fftw_execute()
中的旧计划来转换新数据。
但是,FFTW 确实有一组“New-array Execute Functions”可以在这里提供帮助,假设新数组满足一些与旧数组相关的额外相似性标准(有关详细信息,请参阅链接文档)。
文档推荐:
If you are tempted to use the new-array execute interface because you want to transform a known bunch of arrays of the same size, you should probably go use the advanced interface instead
但那是在谈论转换同时在内存中并以规则方式排列的多个数组。
还要注意,如果您的可变帧大小不是 太可变的——也就是说,如果它始终是相对较少的选择之一——那么你可以考虑在内存中为每个帧大小保留一个单独的计划,而不是每次一个帧的大小与前一个帧的大小不同时重新计算计划。