我发现了这个有趣且功能强大的工具IACA(英特尔架构代码分析器),但我无法理解它.我能用它做什么,它的局限性是什么?我该怎么做:
这让我感到困惑/好奇,为什么这个代码
void maxArray(double* x, double* y) {
for (int i = 0; i < 65536; i++) {
x[i] = ((y[i] > x[i]) ? y[i] : x[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
...比这个代码更快?
void maxArray(double* x, double* y) {
for (int i = 0; i < 65536; i++) {
if (y[i] > x[i]) x[i] = y[i];
}
}
Run Code Online (Sandbox Code Playgroud)
并且作为记录,第一个中的结果程序集与扩展版本相同:
inline double fn(double a, double b) {
if (a > b) {
return a;
} else {
return b;
}
}
void maxArray(double* …Run Code Online (Sandbox Code Playgroud) 我在某处看到 GCC 编译器有时更喜欢在将我的代码转换为 ASM 时不使用条件 mov。
在什么情况下它可能会选择做条件 mov 以外的事情?
我想加速一个简单的积分器,它根据位置和速度描述一组无质量粒子.我不是SSE/AVX专家,但我觉得有趣的是SIMD扩展可以在这里产生什么.
许多论文建议使用数组结构:
struct {
static float2 xy[OUGHTA_BE_ENOUGH];
static float2 vxvy[OUGHTA_BE_ENOUGH];
} Particles;
// in main loop:
Particles.xy[i] += time_delta * Particles.vxvy[i];
Run Code Online (Sandbox Code Playgroud)
但是,对于许多应用来说,相反的方法是有益的:
struct {
float2 xy;
float2 vxvy;
} Particle;
// in main loop:
particles[i].xy += time_delta * particles[i].vxvy;
Run Code Online (Sandbox Code Playgroud)
虽然我模糊地理解要搜索什么来矢量化数组结构版本,但我怀疑有没有办法将SIMD与结构数组版本一起使用,因为字段访问或"调配".
是否有任何技术可以使用SIMD进行上述计算,或者我错过了内在函数?