【发布时间】: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*)&ray->o, _mm_mul_ps(*(__m128*)&ray->d, mt_m));存在一些严重的严格别名问题。 -
我该如何解决这个问题?
-
memcpy 将是天真的解决方案,但您可能应该使用 SSE 类型而不是结构。
-
你看过这两个版本产生的程序集了吗?
-
你用
-O0认真编译了吗?这实质上意味着“禁用优化”。请改用-O2或-O3(或者-Os)。
标签: c optimization mingw sse