30得票2回答
如何使用SIMD实现atoi函数?

我想尝试使用SIMD指令编写一个atoi实现,以便包含在RapidJSON(一个C++ JSON读/写库)中。它目前在其他地方有一些SSE2和SSE4.2优化。如果这可以提高速度,多个atoi结果可以并行执行。字符串最初来自JSON数据缓冲区,因此多重atoi函数将不得不执行任何所需的调整。我...

29得票1回答
我的理解中,AoS和SoA的优缺点是什么?

我最近在阅读关于 AoS vs SoA结构设计和 数据导向设计的文章。很奇怪地是,很难找到关于这两个主题的信息,而且我所发现的似乎都假定了我具有比我实际掌握的处理器功能更深入的理解。尽管如此,特别是对于前一个主题,我所理解的内容引出了一些问题,我认为我应该能够理解答案。 首先,为了确保我的理...

29得票5回答
优秀的可移植SIMD库

有没有人能推荐一个可移植的SIMD库,提供C / C ++ API,在Intel和AMD扩展以及Visual Studio、GCC兼容。我想加速一些操作,比如对512x512的double数组进行缩放,向量点积,矩阵乘法等。 到目前为止,我找到的唯一一个是:http://simdx86.so...

29得票5回答
通过索引获取__m128的成员?

我有一些代码,最初是由一个使用MSVC的人给我的,现在我正在尝试让它在Clang上运行。这是我遇到问题的函数:float vectorGetByIndex( __m128 V, unsigned int i ) { assert( i <= 3 ); return V.m...

28得票19回答
你能让线性搜索变得有多快?

我想要优化这个线性搜索:static int linear (const int *arr, int n, int key) { int i = 0; while (i < n) { if (arr [i] >= ke...

28得票2回答
SIMD和打包双精度与标量双精度的区别 SIMD代表单指令多数据,是一种并行计算技术,可同时处理多个数据。打包双精度是指将多个双精度浮点数打包在一个寄存器中进行计算,而标量双精度则是每个寄存器只能处理一个双精度浮点数。因此,打包双精度可以更快地执行计算,但需要特定的硬件支持。

我正在阅读英特尔的指令集指南,同时实现 SIMD 支持。我有几个疑问,我的问题如下: __m128 _mm_cmpeq_ps (__m128 a, __m128 b) 的文档说明称它用于比较打包的单精度浮点数。"打包"是什么意思?我需要在使用它们之前对我的浮点值进行打包吗? 对于双精度,有...

28得票3回答
如何在256位AVX(YMM)寄存器中交换低128位和高128位?

我正在将SSE SIMD代码移植为使用256位AVX扩展,并且似乎找不到可以混合/洗牌/移动高128位和低128位的任何指令。 背景故事: 我真正想要的是VHADDPS / _mm256_hadd_ps像HADDPS/_mm_hadd_ps一样工作,只是用256位字。不幸的是,它的行为类似...

27得票4回答
如何使用SSE/AVX高效地执行double/int64转换?

SSE2有指令可用于在单精度浮点数和32位整数之间进行向量转换。 _mm_cvtps_epi32() 可将单精度浮点数向量转换为 32 位整数向量。 _mm_cvtepi32_ps() 可将32位整数向量转换为单精度浮点数向量。 但是双精度和64位整数没有相应的指令可用,也就是说,缺少...

26得票2回答
调用always_inline‘_mm_mullo_epi32’时内联失败:目标特定选项不匹配。

我正在尝试使用cmake编译一个使用SIMD指令的C程序。 当我尝试编译它时,我遇到了两个错误: /usr/lib/gcc/x86_64-linux-gnu/5/include/smmintrin.h:326:1:错误:调用always_inline‘_mm_mullo_epi32’失败:目标...

26得票2回答
Haskell的数学性能如何在乘加操作上表现?

我正在使用Haskell编写游戏,我的当前UI设计涉及大量几何图形的程序生成。我目前专注于识别一种特定操作的性能(类似C的伪代码): Vec4f multiplier, addend; Vec4f vecList[]; for (int i = 0; i < count; i++) ...