当前位置: 首页 > 知识库问答 >
问题:

为什么SSE矢量化在这种情况下没有更快?[重复]

尚河
2023-03-14

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

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

在使用clock()函数测量性能时,两个版本的速度一样快,都达到了大约45节拍(超过1000节拍)(SSE:1138节拍-C:1093节拍)。我认为SSE不知何故打乱了时钟()的时间测量,但即使只是简单地计算秒,也没有什么不同。

函数 :(交换注释..)

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倍左右,为什么没有性能提升?

共有1个答案

吉栋
2023-03-14

代码以某种方式自动矢量化,我不知道为什么,但它确实如此。因此,没有太大的性能差异。(下次步骤在汇编代码中优先)

 类似资料:
  • 我用干净的架构在android项目上工作。 我有以下课程: 使用public dispose()方法从onNext实现中释放序列。 但我还是不明白使用它的好处。是否用于在销毁视图时从observable取消订阅,以便从转到并关闭发射器上的订阅?

  • 假设我有这个语法,用Antlr4编写: 我的思维过程是应该与相同;应该是。如果 上面的树似乎是正确的,它再次计算为。 但是当不使用空格时,antlr认为有两个INT-expr。如果 不应该跳过所有空格(使用规则),这意味着两个表达式的解析方式应该相同吗?

  • 根据Java教程 将包装类型(整数)的对象转换为其相应的基元(int)值称为取消装箱。当包装类的对象为: 作为参数传递给需要相应基元类型的值的方法 分配给相应基元类型的变量 为什么在这种情况下会发生拆箱? 在这种情况下,这些事情发生在哪里?是否有管理数组中元素访问的底层方法?或者[]暗示某种变量?

  • 问题内容: 我编写了以下代码来实现Singleton模式: 当我编译此文件时,它应该生成Test.class和Test $ TestHolder.class,但它还会生成Test $ 1.class。这没有道理。那么,为什么以及如何呢? 问题答案: 类需要在中调用私有构造函数。但是它是私有的,实际上不能从另一个类中调用。因此,编译器发挥了作用。它 添加了一个仅知道的新的非私有构造函数!_该构造函数

  • 我有一个h2作为唯一的项目在一个容器div。我在容器上使用position:relative和h2上使用position:absolute/bottom:0使它与容器底部对齐。但是,我无法使h2文本与容器div的右侧对齐。 HTML: CSS: 链接:http://www.distributionaccess.com/new/stempath/about.html 我在h2上尝试了display:

  • 问题内容: 来自问题的原因,或者说更确切地说,object .__new__在这两种情况下的工作方式不同 作者对为什么不感兴趣,而对如何感兴趣。 我非常想了解原因,尤其是: 为什么不打印任何参数而不是 为什么没有为testclass3引发错误?(因为除了自我之外没有其他参数) 码 问题答案: 您正在使用旧的Python版本;此错误消息已更新: Python只会抱怨既不支持又不被覆盖的参数。例如,当