c - 为什么kiss_fft 的正向和反向 radix-4 计算不同,第 2 部分?
问题描述
第 1 部分 - 为什么下面的代码首先检查 st_inverse
Kiss_fft 代码在循环中有这个分支:
do {
if(st->inverse) {
Fout[m].r = scratch[5].r - scratch[4].i;
Fout[m].i = scratch[5].i + scratch[4].r;
Fout[m3].r = scratch[5].r + scratch[4].i;
Fout[m3].i = scratch[5].i - scratch[4].r;
}else{
Fout[m].r = scratch[5].r + scratch[4].i;
Fout[m].i = scratch[5].i - scratch[4].r;
Fout[m3].r = scratch[5].r - scratch[4].i;
Fout[m3].i = scratch[5].i + scratch[4].r;
}
++Fout;
} while (--k); // Fout[] has k*4 elements.
稍微重新排序:
if(st->inverse) {
Fout[m].r = scratch[5].r - scratch[4].i;
Fout[m].i = scratch[5].i + scratch[4].r;
Fout[m3].r = scratch[5].r + scratch[4].i;
Fout[m3].i = scratch[5].i - scratch[4].r;
}else{
Fout[m3].r = scratch[5].r - scratch[4].i;
Fout[m3].i = scratch[5].i + scratch[4].r
Fout[m].r = scratch[5].r + scratch[4].i;
Fout[m].i = scratch[5].i - scratch[4].r;;
}
这两个代码块的真正区别仅在于它们对m
和的使用m3
。但是m
并且m3
在循环内部没有改变。我可以通过交换m
和简单地消除这个内循环分支m3
吗?
if(st->inverse) { swap(&m, &m3); }
do {
Fout[m].r = scratch[5].r - scratch[4].i;
Fout[m].i = scratch[5].i + scratch[4].r;
Fout[m3].r = scratch[5].r + scratch[4].i;
Fout[m3].i = scratch[5].i - scratch[4].r;
++Fout;
} while (--k);
解决方案
我确实可以使用该优化。但是,对于可以使用 AVX 的当前编译器来说,这不是必需的。他们也将使用vpcmpeqd
and删除该分支vblendvps
。
推荐阅读
- python - Astropy 坐标:第二近邻
- c# - 如何从C#中的目录中获取特定文件
- angular - Angular 6 - 429 响应处理
- react-native - Redux async actioncreator 无法识别
- arrays - 为什么,当通过 ParamArray 将数组元素传递给函数时,varpointer 会到达函数中?
- android - 如何将 Google Assistant 与我的应用关联以获取 Assistant 响应?
- regex - PostgreSQL regex_replace
- kubernetes - 如何在外部连接到 Kubernetes 上的 Kafka
- hdfs - How to start secondary Namenode in AWS EMR
- javascript - 格式化数字供人类使用