我想了解更多关于使用SSE的知识.

除了显而易见的阅读Intel® 64 and IA-32 Architectures Software Developer's Manuals之外,还有什么学习方法?

主要是我有兴趣和GCC X86 Built-in Functions人一起工作.

推荐答案

首先,我不建议使用内置函数--它们不能移植(跨相同ARCH的编译器).

使用intrinsics、GCC does a wonderful job将SSE内部函数优化为更优化的代码.您可以随时查看组件,了解如何充分利用SSE.

内部函数很简单-就像普通函数调用一样:

#include <immintrin.h>  // portable to all x86 compilers

int main()
{
    __m128 vector1 = _mm_set_ps(4.0, 3.0, 2.0, 1.0); // high element first, opposite of C array order.  Use _mm_setr_ps if you want "little endian" element order in the source.
    __m128 vector2 = _mm_set_ps(7.0, 8.0, 9.0, 0.0);

    __m128 sum = _mm_add_ps(vector1, vector2); // result = vector1 + vector 2

    vector1 = _mm_shuffle_ps(vector1, vector1, _MM_SHUFFLE(0,1,2,3));
    // vector1 is now (1, 2, 3, 4) (above shuffle reversed it)
    return 0;
}

使用_mm_load_ps_mm_loadu_ps从数组加载数据.

当然还有更多的 Select ,SSE真的很强大,而且在我看来相对容易学习.

有关指南的一些链接,请参见https://stackoverflow.com/tags/sse/info.

C++相关问答推荐

传递给空闲的无效地址0x71 db7 cb5e0:未分配值

Zig将std.os.argv转换为C类型argv

是否定义了数组指针类型转换为指针类型?""""

单指针和空参数列表之间的函数指针兼容性

如何一次获取一个字符

减法运算结果的平方的最快方法?

如何在c++中包装返回空*的函数

具有交换链获取和命令缓冲区提交的同步-危险-读后写错误

如何在下面的C代码中正确管理内存?

GTK3按钮信号错误

RawMotion的XInput2错误(具有较高值的XISelectEvents上的BadValue)

如何在C中定义指向函数的指针并将该指针赋给函数?

与外部SPI闪存通信时是否应禁用中断?

Tcl_GetDoubleFromObj在列表的迭代中是一个缺点

在git补丁中自动添加C的宏

如何在C中计算包含递增和递减运算符的逻辑表达式?

分支预测和UB(未定义的行为)

保存有符号整数结果的变量是否会溢出(后增量的副作用),并且此后从未在任何表达式中使用过它,是否会导致 UB?

C23 中是否有 __attribute__((nonnull)) 的等效项?

定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗?