- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试提高 this 的性能通过向量化此函数来编写代码:
inline float calcHaarPattern( const int* origin, const SurfHF* f, int n )
{
double d = 0;
for( int k = 0; k < n; k++ )
d += (origin[f[k].p0] + origin[f[k].p3] - origin[f[k].p1] - origin[f[k].p2])*f[k].w;
return (float)d;
}
据我所知,您可以矢量化涉及恰好一个数学运算的循环。在上面的代码中,我们有 5 个数学运算,所以(使用 OMP):
#pragma omp simd
for( int k = 0; k < n; k++ )
d += (origin[f[k].p0] + origin[f[k].p3] - origin[f[k].p1] - origin[f[k].p2])*f[k].w;
这行不通。但是,我在想如果只用一个数学运算将上面的循环分成多个循环是矢量化的好做法吗?生成的代码将是:
double p0[n], p3[n], p1[n], p2[n];
#pragma omp simd
for( int k = 0; k < n; k++ )
p0[k] = origin[f[k].p0]*f[k].w;
#pragma omp simd
for( int k = 0; k < n; k++ )
p3[k] = origin[f[k].p3]*f[k].w;
#pragma omp simd
for( int k = 0; k < n; k++ )
p1[k] = origin[f[k].p1]*f[k].w;
#pragma omp simd
for( int k = 0; k < n; k++ )
p2[k] = origin[f[k].p2]*f[k].w;
#pragma omp simd
for( int k = 0; k < n; k++ )
d += p0[k];
#pragma omp simd
for( int k = 0; k < n; k++ )
d -= p1[k];
#pragma omp simd
for( int k = 0; k < n; k++ )
d -= p2[k];
#pragma omp simd
for( int k = 0; k < n; k++ )
d += p3[k];
这是一个好的解决方案,还是有更好的解决方案?现代编译器(比如 gcc
)将自行进行这种(或更好的)优化(例如启用 -O3
)(因此实际上没有性能提升) ?
最佳答案
这通常是糟糕的 HPC 编程实践,原因如下:
循环拆分的理论优势也很少,但它们不适用于您的情况,因此我提供它们以防万一。在以下情况下,循环拆分是合理的/有利可图的:
Intel Advisor (您在上一个问题中提到过)有助于分析许多这些因素并衡量 AI。
这也是事实,好的编译器“不关心”每当您有一个这样的循环或循环拆分时,因为它们可以轻松地将一种情况转换为另一种情况,反之亦然。然而,这种转换在实际代码中的适用性非常有限,因为要做到这一点,您必须在编译时知道很多额外信息:指针或动态数组是否重叠,数据是否对齐等等等等。所以您不应该依赖编译器转换和特定的编译器次要版本,而是尽可能多地编写 HPC 就绪代码。
关于c++ - 这是矢量化的好做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42175752/
如果您想分享更多信息,可以在这里找到整个资源 指针: https://github.com/sergiotapia/DreamInCode.Net 基本上,我的API将为其他开发人员提供
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我不是 SCM 工具的经验丰富的用户,尽管我确信它们的用处,当然。 我在以前的工作中使用了一些不起眼的商业工具,在当前的工作中使用了 Perforce,并在我的小型个人项目中使用了 TortoiseS
所以我想知道一些我应该避免在 javascript 中做的事情以获得良好的 SEO 排名。在我的下一个站点中,我将广泛使用 jquery 和 javascript,但不想牺牲 SEO。那么您认为我应该
基本上,我想知道什么是避免 future CSS 代码出现问题和混淆的最佳方法... 像这样命名 CSS 属性: div#content ul#navigation div.float-left (真
我是一名优秀的程序员,十分优秀!