【问题标题】:Why is SSE vectorization not faster in this case? [duplicate]为什么在这种情况下 SSE 向量化不快? [复制]
【发布时间】:2019-12-10 06:15:30
【问题描述】:

我的 SSE 代码和标准 C 代码一样慢,我做错了什么?

我在 Intel i3-6100 CPU 上运行,使用带有 minGW 和 CLion 的 C,我使用 -O0 标志。

我正在使用 clock() 函数测量性能,两个版本都同样快到大约 45 个滴答声(超过 1000 个滴答声)(SSE:1138 个滴答声 - C:1093 个滴答声)。 我认为 SSE 以某种方式弄乱了 clock() 时间测量,但即使简单地计算秒数也没有区别。

函数:(交换 cmets..)

void vTrace(struct Ray * ray, float t, struct Vec3f * r){
    //__m128 * mr = (__m128 *)r;
    //__m128 mt_m = _mm_set1_ps(t);
    //*mr = _mm_add_ps(*(__m128*)&ray->o, _mm_mul_ps(*(__m128*)&ray->d, mt_m));
    r->x = ray->o.x + ray->d.x*t;
    r->y = ray->o.y + ray->d.y*t;
    r->z = ray->o.z + ray->d.z*t;

}

基准测试代码:

float benchmark_t = 1;
struct Ray benchmark_ray;
vInit3f(&benchmark_ray.o, 0.2, 0.23, 1.4);
vInit3f(&benchmark_ray.d, 0.2, 0.23, 1.4);
ticks = clock();
i = 0;
while(i < 1000000000 ){
    vTrace(&benchmark_ray, benchmark_t, &benchmark_ray.o);
    i ++;
}
printf("TIME : %i ticks\n", (clock()-ticks));
printVec("result", benchmark_ray.o);

结构:

struct Vec3f{
    float x;
    float y;
    float z;
    float w;//just for SSE
};

struct Ray{
    struct Vec3f o;
    struct Vec3f d;
    struct Vec3f inverse_d;
};

使用 SSE,性能应该快 4 倍,为什么没有性能提升?

【问题讨论】:

  • _mm_add_ps(*(__m128*)&amp;ray-&gt;o, _mm_mul_ps(*(__m128*)&amp;ray-&gt;d, mt_m)); 存在一些严重的严格别名问题。
  • 我该如何解决这个问题?
  • memcpy 将是天真的解决方案,但您可能应该使用 SSE 类型而不是结构。
  • 你看过这两个版本产生的程序集了吗?
  • 你用-O0认真编译了吗?这实质上意味着“禁用优化”。请改用-O2-O3(或者-Os)。

标签: c optimization mingw sse


【解决方案1】:

代码以某种方式自动矢量化,我不知道为什么,但确实如此。 所以没有很大的性能差异。 (汇编代码中的下一个时间步)

【讨论】:

    猜你喜欢
    • 2014-09-13
    • 2018-08-28
    • 2017-03-05
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2021-01-31
    • 1970-01-01
    相关资源
    最近更新 更多