小编Jen*_*unk的帖子

为多个SIMD架构生成代码

我编写了一个库,我使用CMake来验证MMX,SSE,SSE2,SSE4,AVX,AVX2和AVX-512的标头是否存在.除此之外,我检查是否存在指令,如果存在,我添加必要的编译器标志,-msse2 -mavx -mfma等.

这一切都非常好,但我想部署一个二进制文件,它适用于各代处理器.

问题:是否有可能告诉编译器(GCC)每当使用SIMD优化函数时,它必须为架构列表生成代码?当然还有高级分支机构

我在想类似于编译器如何为函数生成代码,其中输入指针是4或8字节对齐的.为了防止这种情况,我使用__builtin_assume_aligned宏.

什么是最佳做法?多个二进制文件?命名?

gcc simd avx sse4

10
推荐指数
2
解决办法
1575
查看次数

Valgrind非法指令AVX

使用valgrind评估我的程序时收到一些错误.更准确地说,我得到的错误就像

vex amd64-> IR:未处理的指令字节:0xC5 0xF8 0x28 0x0 0xC5 0xF8 0x29 0x45 ......非法指令

我将问题分离到一个非常简单的例子

#include <immintrin.h>
int main() {
  float f __attribute__((aligned(16))); // No need to be aligned
  f = 2.0f;
  __m128 a = _mm_broadcast_ss(&f);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序使用gcc编译,选项为-mavx.如果使用SSE2指令_mm_set1_ps,则会发生相同的错误,但仅在使用-mavx编译时才会发生.使用-msse2编译程序时,valgrind报告没有错误.

我怀疑这是一个valgrind错误,但是找不到关于x86的任何报告.我的机器是Core-i7 Sandy-Bridge和valgrind版本3.7.0.

如果有人有更好的替代valgrind的寄存器感知编程,我想知道.

提前致谢

c c++ valgrind

1
推荐指数
1
解决办法
1250
查看次数

标签 统计

avx ×1

c ×1

c++ ×1

gcc ×1

simd ×1

sse4 ×1

valgrind ×1