数学“pow”函数 gcc 的 SSE 向量化

2023-11-24

我试图对包含数学库中“pow”函数的使用的循环进行矢量化。我知道英特尔编译器支持对 sse 指令使用“pow” - 但我似乎无法让它与 gcc 一起运行(我认为)。这是我正在处理的情况:

int main(){
        int i=0;
        float a[256],
        b[256];

        float x= 2.3;


        for  (i =0 ; i<256; i++){
                a[i]=1.5;
        }

        for (i=0; i<256; i++){
                b[i]=pow(a[i],x);
        }

        for (i=0; i<256; i++){
                b[i]=a[i]*a[i];
        }
    return 0;

}

我正在编译以下内容:

gcc -O3 -Wall -ftree-vectorize -msse2 -ftree-vectorizer-verbose=5 code.c -o runthis

这是在 os X 10.5.8 上使用 gcc 版本 4.2(我也使用了 4.5,无法判断它是否对任何内容进行了矢量化 - 因为它根本没有输出任何内容)。似乎没有一个循环矢量化 - 是否存在对齐问题或其他一些我不需要使用限制的问题?如果我将其中一个循环编写为函数,我会得到稍微更详细的输出(代码):

void pow2(float *a, float * b, int n) {
        int i;
        for (i=0; i<n; i++){
                b[i]=a[i]*a[i];
        }
}

输出(使用 7 级详细输出):

note: not vectorized: can't determine dependence between *D.2878_13 and *D.2877_8
bad data dependence.

我看了看gcc 自动矢量化页面但这并没有多大帮助。如果无法在 gcc 版本中使用 pow,我在哪里可以找到执行 pow 等效函数的资源(我主要处理整数幂)。

Edit所以我只是深入研究其他来源 - 它是如何矢量化的?!:

void array_op(double * d,int len,double value,void (*f)(double*,double*) ) { 
    for ( int i = 0; i < len; i++ ){
        f(&d[i],&value);
    }
};

相关的 gcc 输出:

note: Profitability threshold is 3 loop iterations.

note: LOOP VECTORIZED.

好吧,现在我不知所措——“d”和“value”被 gcc 不知道的函数修改了——奇怪吗?也许我需要更彻底地测试这部分,以确保矢量化部分的结果是正确的。仍在寻找矢量化数学库 - 为什么没有开源库?


Using __restrict或者在写入输出之前消耗输入(分配给本地变量)应该会有所帮助。

现在,编译器无法矢量化,因为a可能别名b,因此并行执行 4 次乘法并写回 4 个值可能不正确。

(注意__restrict不能保证编译器向量化,但可以说现在,它肯定cannot).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数学“pow”函数 gcc 的 SSE 向量化 的相关文章

随机推荐

  • Sin 和 Cos 函数返回不正确的结果[重复]

    这个问题在这里已经有答案了 可能的重复 得到正弦 180 的值为 1 22465e 16 我正在计算圆圆周上的一个点 我有圆的半径和圆心 在这里你可能会说 有什么大不了的 有一个直接的公式 是的 角度的单位是rad x x r sin an
  • 在 NumPy 中按列对数组进行排序

    如何按 NumPy 数组的第 n 列对它进行排序 例如 给定 a array 9 2 3 4 5 6 7 0 5 我想对行进行排序a由第二列得到 array 7 0 5 9 2 3 4 5 6 按第二列排序a a a 1 argsort
  • docker容器id是如何生成的

    我想知道容器id是如何生成的 所以请提供执行docker run时提供容器id的源代码 以下是 docker 守护进程用于创建容器的函数的代码片段 func daemon Daemon newContainer name string co
  • 我需要为使用 viewpager 和 tablayout 创建的选项卡分配一个唯一的选项卡 ID?

    我使用 viewpager 和 Tablayout 创建了一个基于选项卡的应用程序 当我单击按钮时 会使用子片段创建新选项卡 我需要的是为我的选项卡分配不同的选项卡 ID 并且每个选项卡 ID 应该不同 我尝试采取选项卡的位置 但不幸的是
  • .prop() VS .val().使用 jQuery 设置输入文本值

    读完后 有趣的 prop 与 attr and jQuery 性能 属性我心中出现了关于哪个更好使用的疑问 prop 还是 val 我想设置一个输入文本值 The jQuery prop 页面说道 属性通常会影响 DOM 元素的动态状态 而
  • 如何使图像在更大的 div 内居中(垂直和水平)[重复]

    这个问题在这里已经有答案了 我有一个 200 x 200 像素的 div 我想在 div 中间放置一个 50 x 50 像素的图像 如何做呢 我可以使用它使其水平居中text align center对于 div 但垂直对齐是个问题 在旧浏
  • 如何使用在同一 CPU 上运行的调试器读取 CPU 寄存器?

    当我学习汇编时 我按以下方式使用 GDB gdb a out a is a compiled C script that only prints hello world break main run info registers 当我自己使
  • Java流-同时具有anyMatch和noneMatch操作的目的?

    如果找到一个元素 anyMatch 操作将返回 true 如果找到匹配的元素 noneMatch 操作将返回 false 如果没有找到匹配元素 anyMatch 操作将返回 false 如果没有找到匹配元素 noneMatch 操作将返回
  • 如何将终端中的文本对齐到中心?

    我想让我的文本水平对齐到终端的中心 我怎样才能在C中做到这一点 扩展 eyalm的答案 如果你得到了COLUMNSvar 你可以像这样居中字符串 int columns strtol getenv COLUMNS NULL 10 int f
  • C# 为什么在订阅事件时要使用“new”关键字?

    以下两种订阅活动的方式有什么区别 receiver ConfigChanged Config ConfigChanged receiver ConfigChanged new EventHandler Config ConfigChange
  • 如何在 CoreData+CloudKit 应用程序中修剪历史记录?

    我的应用程序使用 CoreData 和 iCloud 作为后端 多个设备可以访问 iCloud 数据库 因此 public 本地 CoreData 存储使用 iCloud 同步NSPersistentCloudKitContainer 我根
  • 我可以动态更改 mobile safari 中的视口元标记吗?

    我有一个为移动 Safari 浏览器构建的 AJAX 应用程序 需要显示不同类型的内容 对于某些内容 我需要user scalable 1对于其他的 我需要user scalable 0 有没有办法在不刷新页面的情况下修改content属性
  • 获取 ALAsset 的路径

    如何获取 ALAsset 数组中每个项目的路径 我想要获取图像 以便将它们添加到电子邮件中 e g NSString path NSBundle mainBundle pathForResource sample ofType png NS
  • 焊接未正确初始化

    我正在搭建JavaEE7中学习CDI的基本环境 我有以下代码用于启动Weld 只需要启动和关闭即可 package com anshbansal import org jboss weld environment se Weld impor
  • SQL 访问查询 - 如果存在则更新行,如果不存在则插入

    我需要为 MS Access 2000 编写一个 SQL 查询 以便更新行 如果存在 但如果不存在则插入 i e 如果行存在 UPDATE Table1 SET WHERE Column1 SomeValue 如果它不存在 INSERT I
  • strtotime 日期奇怪的结果

    给定以下字符串日期 Fri Sep 02 2011 21 00 00 GMT 0100 GMT Daylight Time 在 php 中 如果我在上面执行 strtotime 然后将其转换回字符串日期 似乎会增加一个小时 echo str
  • C# - 将数字附加到正在保存的文件中

    我已经创建了一个屏幕截图程序 一切运行良好 唯一的问题是 我不知道如何才能做到这一点 以便屏幕截图以附加数字的形式保存 例如 屏幕截图 1 屏幕截图 2 屏幕截图 3 屏幕截图 4 等 显然这可以应用于正在保存的其他文件 有任何想法吗 谢谢
  • Oracle存储过程中字符串缓冲区太小错误

    我在 Oracle 11g 存储过程中遇到错误 错误是 ORA 06502 PL SQL numeric or value error character string buffer too small 它发生在第 31 行 该行包含out
  • Python Pandas 并排绘制两个 BARH

    I am trying to make a plot that is similar like this 左侧图表 带图例的图 源自df 2 右侧图表源自df 1 但是 我无法使两个图并排共享 y 轴 这是我目前的绘图方式 df 1 tar
  • 数学“pow”函数 gcc 的 SSE 向量化

    我试图对包含数学库中 pow 函数的使用的循环进行矢量化 我知道英特尔编译器支持对 sse 指令使用 pow 但我似乎无法让它与 gcc 一起运行 我认为 这是我正在处理的情况 int main int i 0 float a 256 b