问题标签 [simd]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - SIMD/SSE 新手:简单的图像过滤
我对 SIMD/SSE 很陌生,我正在尝试做一些简单的图像过滤(模糊)。下面的代码使用水平方向的简单 [1 2 1] 权重过滤 8 位灰色位图的每个像素。我一次创建 16 个像素的总和。
至少对我来说,这段代码看起来很糟糕的是,其中有很多插入/提取,这不是很优雅,并且可能也会减慢一切。转移时是否有更好的方法将数据从一个 reg 包装到另一个 reg 中?
buf 是图像数据,16 字节对齐。w/h 是宽度和高度,是 16 的倍数。
x86 - Complex Mul and Div using sse Instructions
Is performing complex multiplication and division beneficial through SSE instructions? I know that addition and subtraction perform better when using SSE. Can someone tell me how I can use SSE to perform complex multiplication to get better performance?
c - 如何在 ARM Cortex-a8 中使用乘法和累加内在函数?
如何使用 GCC 提供的 Multiply-Accumulate 内在函数?
谁能解释我必须传递给这个函数的三个参数。我的意思是源和目标寄存器以及函数返回什么?
帮助!!!
c++ - 如何使用 Eigen,线性代数的 C++ 模板库?
我有一个由矩阵组成的图像处理算法,我有自己的矩阵运算代码(乘法,逆......)。但是我使用的处理器是 ARM Cortex-A8 处理器,它具有 NEON 协处理器进行矢量化,因为矩阵运算是 SIMD 运算的理想情况,我要求编译器 (-mfpu=neon -mfloat-abi=softfp) 生成 NEON我的代码的说明,但编译器没有这样做,然后我还尝试为 Matrix 操作编写自己的 NEON 内在代码,但我发现这样做非常困难。
所以,我想到了利用Eigen库来保证矩阵运算的向量化。因此,我立即下载了 Eigen C++ 库并尝试按照他们的教程中给出的方式使用它,但不幸的是,当我运行他们的示例程序时出现编译错误。
任何有使用 Eigen 经验的人,任何例子都会很有帮助吗?请帮助我如何去做。
帮助!
谢谢
我的 Eigen 文件夹位于:/home/ubuntu/Documents/eigen我在 Eclipse 的 C++ 项目的附加目录中设置了这个路径。然后我运行以下程序(示例)-
我得到的错误 -
为项目 Test_Eigen 构建配置调试 ****
做所有
构建文件:../main.cpp
调用:Sourcery G++ C++ 编译器
arm-none-linux-gnueabi-g++ -I/home/ubuntu/Documents/eigen -O0 -g3 -Wall -c -fmessage-length=0 -fcommon -MMD -MP -MF"main.d" -MT"main .d" -mcpu=cortex-a8 -marm -o"main.o"
“../main.cpp”
../main.cpp:6: 错误: 'int' 之前的预期构造函数、析构函数或类型转换 make: *** [main.o] 错误 1
c - SIMD值得吗?有更好的选择吗?
我有一些运行良好的代码,但我想让它运行得更好。我遇到的主要问题是它需要有一个嵌套的 for 循环。外层用于迭代(必须连续发生),内层用于考虑中的每个点粒子。我知道对于外部我无能为力,但我想知道是否有一种优化方法,例如:
我看过 SIMD,虽然我找不到太多关于它的信息,而且我不完全确定正确提取和打包数据所需的处理是否值得做一半的指令,因为显然只有一次可以使用两个双打。
我尝试使用 shm 和 pthread_barrier 将其分解为多个线程(以同步不同的阶段,上面的代码就是其中之一),但这只是让它变慢了。
我当前的代码确实运行得很快。每 10M 个粒子*迭代大约需要 1 秒,据我从 gprof 得知,我 30% 的时间都花在了这个函数上(5000 次调用;PART_COUNT=8192 个粒子花费了 1.8 秒)。我不担心小的、固定时间的事情,只是上次 512K 粒子 * 50K 迭代 * 1000 次实验花了一周多的时间。
我想我的问题是,是否有任何方法可以处理这些长向量,而不仅仅是循环它们。我觉得应该有,但我找不到。
algorithm - 是否可以使用 SIMD 指令进行 3x3 矩阵求逆?
我正在使用基于 ARM Cortex-A8 的处理器,并且我有几个地方可以计算 3x3 矩阵逆运算。
由于 Cortex-a8 处理器有一个 NEON SIMD 处理器,我有兴趣将此协处理器用于 3x3 矩阵逆运算,我看到了几个 4x4 实现(英特尔 SSE 和freevec),但我在哪里没有看到执行 3x3 矩阵逆运算使用 SIMD 指令。freevec 使用的方法是将 4x4 矩阵拆分为 4、2x2 矩阵,然后对每个矩阵进行微小的操作,最后将结果重新组合,得到 4x4 矩阵的逆矩阵。我看不到 3x3 矩阵有这样的机会。
任何人都知道如何使用 SIMD 指令执行 3x3 矩阵求逆,这对我很有帮助吗?
问候维克拉姆
simd - 如何使用 NEON SIMD 合并 2 行的元素?
我有一个
我有 2 行,
从这些我怎么能得到 -
是否有任何单个 NEON SIMD 指令可以合并这两行?或者我怎样才能使用内在函数尽可能少的步骤来实现这一点?
我想过使用zip/unzip内在函数,但zip 函数返回的数据类型float32x2x2_t
不适合我,我需要一个float32x4_t
数据类型。
optimization - SSE2 内在函数:直接访问内存
许多 SSE 指令允许源操作数是 16 字节对齐的内存地址。例如,各种 (un)pack 指令。PUNCKLBW 具有以下签名:
PUNPCKLBW xmm1, xmm2/m128
现在这对于内在函数似乎根本不可能。看起来必须使用 _mm_load* 内在函数来读取内存中的任何内容。这是 PUNPCKLBW 的内在函数:
__m128i _mm_unpacklo_epi8 (__m128i a, __m128i b);
(据我所知,__m128i 类型总是指一个 XMM 寄存器。)
现在,这是为什么呢?这是相当可悲的,因为我通过直接寻址内存看到了一些优化潜力......
c - 包装好的 SSE 花车上的翻转标志
我正在寻找最有效的方法来翻转包装在 SSE 寄存器中的所有四个浮点数上的符号。
我在英特尔架构软件开发手册中没有找到这样做的内在因素。以下是我已经尝试过的事情。
对于每种情况,我都循环了代码 100 亿次,并得到了指示的挂墙时间。我试图至少匹配 4 秒,这需要我的非 SIMD 方法,它只使用一元减号运算符。
[48 秒]
_mm_sub_ps( _mm_setzero_ps(), vec );
[32 秒]
_mm_mul_ps( _mm_set1_ps( -1.0f ), vec );
[9 秒]
编译器是带有 -O3 的 gcc 4.2。CPU 是 Intel Core 2 Duo。
x86 - SSE 访问冲突
我有代码:
从这里我得到:
运行程序时,错误发生在 _mm_add_ps 行。
original 使用 _aligned_malloc(..., 16); 以及传递给函数,所以就我对 sse 的理解而言,它不应该是不对齐的。
我想知道是否有人可以看到为什么会崩溃,因为我不明白为什么。
编辑:宽度和 col 始终是 4 的倍数。 Col 是 0 或 4,而 width 始终是 4 的倍数。
EDIT2:看起来我的原始数组未对齐。不会:
确保原件在函数内部对齐?
Edit3:这真的很奇怪。当我做:
断言失败