【发布时间】:2015-05-18 23:55:58
【问题描述】:
如何高效地将以下代码 sn-p 转换为 NEON 内部函数?
C++
int diff_scale, c0, c1;
cost = (short)(cost + std::min(c0, c1) >> diff_scale));
上海证券交易所
__m128i ds = _mm_cvtsi32_si128(diff_scale);
__m128i c0 = _mm_load_si128((__m128i*)(cost));
__m128i c1 = _mm_load_si128((__m128i*)(cost + 8));
__m128i z = _mm_setzero_si128();
_mm_store_si128((__m128i*)(cost), _mm_adds_epi16(c0, _mm_srl_epi16(_mm_unpacklo_epi8(diff, z), ds)));
_mm_store_si128((__m128i*)(cost + 8), _mm_adds_epi16(c1, _mm_srl_epi16(_mm_unpackhi_epi8(diff, z), ds)));
【问题讨论】:
-
首先对纯 C++ 代码进行基准测试 - 您可能会发现它足够快,您不需要 SIMD (Neon) 版本。
-
我首先在 SSE 中写这个的原因是因为 C++ 很慢(比 SIMD 版本慢得多)。现在,我只是试图将其扩展到 ARM 设备。换句话说,是的,C++ 版本很慢,我确实需要 SIMD 版本。 :)
-
如果您认为 Neon 会产生与 SSE 一样大的影响,那么您可能会有些失望。
-
你能解释一下为什么吗?将此线性代码转换为 SIMD 可以极大地加快 Intel 架构的速度——那么为什么不在 ARM 上呢?请注意,这行代码虽然看起来很简单,但却被调用了数千次。
-
ARM 是一个更加简单的架构 - Neon 会提高一些速度,但它可能不会像 SSE 的改进那么显着。
标签: c++ arm sse neon intrinsics