相关疑难解决方法(0)

什么是IACA以及如何使用它?

我发现了这个有趣且功能强大的工具IACA(英特尔架构代码分析器),但我无法理解它.我能用它做什么,它的局限性是什么?我该怎么做:

  • 用它来分析C或C++中的代码?
  • 用它来分析x86汇编程序中的代码?

c c++ performance assembly iaca

54
推荐指数
1
解决办法
7985
查看次数

为什么 x[i]=if 比 if... x[i]= 快

这让我感到困惑/好奇,为什么这个代码

[见组装]

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)

c x86 gcc x86-64 compiler-optimization

4
推荐指数
1
解决办法
121
查看次数

GCC 编译器中的条件移动 (cmov)

我在某处看到 GCC 编译器有时更喜欢在将我的代码转换为 ASM 时不使用条件 mov。

在什么情况下它可能会选择做条件 mov 以外的事情?

c assembly gcc compiler-optimization

2
推荐指数
1
解决办法
748
查看次数

我可以使用AVX/SSE调配AoS布局而不是SoA吗?

我想加速一个简单的积分器,它根据位置和速度描述一组无质量粒子.我不是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进行上述计算,或者我错过了内在函数?

c++ sse simd vectorization avx

1
推荐指数
1
解决办法
283
查看次数

标签 统计

c ×3

assembly ×2

c++ ×2

compiler-optimization ×2

gcc ×2

avx ×1

iaca ×1

performance ×1

simd ×1

sse ×1

vectorization ×1

x86 ×1

x86-64 ×1