【发布时间】:2017-09-21 17:40:31
【问题描述】:
我正在尝试将包含 SSE 指令的 c++ 源代码中的代码重写为仅 c++ 代码。我知道我会失去性能,但它是一个实验,我正在尝试执行。 我想知道是否有与 __mm_unpackhi_pd 和 __mm_unpacklo_pd 相同的 C++ 等效项。我对 SSE 的了解为零。
我正在尝试转换的代码的 sn-p 以供参考。任何知识或提示都会有所帮助。谢谢你。
for (unsigned chunk = 0; chunk < chunks; chunk++)
{
unsigned start = chunk * chunksize;
unsigned end =
std::min((chunk + 1) * chunksize, (unsigned)2 * w);
__m128d a2b2 =
_mm_load_pd(d_origx +
((2 * init_G_offset + start) & n2_m_1));
unsigned i2_mod_B = 0;
for (unsigned i = start; i < end; i += 2)
{
__m128d ab = a2b2;
a2b2 =
_mm_load_pd(d_origx +
((origx_offset + i) & n2_m_1));
__m128d cd = _mm_load_pd(d_filter + i);
__m128d cc = _mm_unpacklo_pd(cd, cd);
__m128d dd = _mm_unpackhi_pd(cd, cd);
__m128d a0a1 = _mm_unpacklo_pd(ab, a2b2);
__m128d b0b1 = _mm_unpackhi_pd(ab, a2b2);
__m128d ac = _mm_mul_pd(cc, a0a1);
__m128d ad = _mm_mul_pd(dd, a0a1);
__m128d bc = _mm_mul_pd(cc, b0b1);
__m128d bd = _mm_mul_pd(dd, b0b1);
__m128d ac_m_bd = _mm_sub_pd(ac, bd);
__m128d ad_p_bc = _mm_add_pd(ad, bc);
__m128d ab_times_cd = _mm_unpacklo_pd(ac_m_bd, ad_p_bc);
__m128d a2b2_times_cd =
_mm_unpackhi_pd(ac_m_bd, ad_p_bc);
__m128d xy = _mm_load_pd(d_x_sampt + i2_mod_B);
__m128d x2y2 = _mm_load_pd(d_x_sampt + i2_mod_B + 2);
__m128d st = _mm_add_pd(xy, ab_times_cd);
__m128d s2t2 = _mm_add_pd(x2y2, a2b2_times_cd);
_mm_store_pd(d_x_sampt + i2_mod_B, st);
_mm_store_pd(d_x_sampt + i2_mod_B + 2, s2t2);
i2_mod_B += 4;
}
}
【问题讨论】:
-
我确信这是对术语的迂腐狡辩,但是……这是 C++代码!当然,它使用 SSE 内在函数,但它仍然是用 C++ 编写的,并且需要 C++ 编译器来编译它。最重要的是,它具有使用 SSE 指令以获得最佳性能的所有优点,没有典型的缺点。唯一的“限制”是它要求您的处理器支持 SSE,这不是很高的标准,只是限制了可移植性。
-
当然它是一个 c++。我的错。我只是想删除 SSE 指令。