我在网络和英特尔软件手册上搜索过.但我无法确认所有英特尔64架构是否支持SSSE3或SSE4.1或SSE4.2或AVX等.因此,我可以在程序中使用最少的SIMD支持指令.请帮忙.
我需要使用 16 位值(正值)并将它们提升为 32 位。
使用 SIMD(我仅限于 SSE3),以下是我提出的两个选项:
reg_xmm0 = _mm_loadu_si128((const __m128i *)(Src));
reg_xmm2 = _mm_loadu_si128((const __m128i *)(Src+8));
reg_xmm1 = _mm_unpackhi_epi16(reg_xmm0,_mm_setzero_si128());
reg_xmm0 = _mm_unpacklo_epi16(reg_xmm0,_mm_setzero_si128());
reg_xmm3 = _mm_unpackhi_epi16(reg_xmm2,_mm_setzero_si128());
reg_xmm2 = _mm_unpacklo_epi16(reg_xmm2,_mm_setzero_si128());
Run Code Online (Sandbox Code Playgroud)
或者我可以这样做,
reg_xmm0 = _mm_loadl_epi64((const __m128i *)(Src));
reg_xmm1 = _mm_loadl_epi64((const __m128i *)(Src+4));
reg_xmm2 = _mm_loadl_epi64((const __m128i *)(Src+8));
reg_xmm3 = _mm_loadl_epi64((const __m128i *)(Src+12));
reg_xmm0 = _mm_unpacklo_epi16(reg_xmm0,_mm_setzero_si128());
reg_xmm1 = _mm_unpacklo_epi16(reg_xmm1,_mm_setzero_si128());
reg_xmm2 = _mm_unpacklo_epi16(reg_xmm2,_mm_setzero_si128());
reg_xmm3 = _mm_unpacklo_epi16(reg_xmm3,_mm_setzero_si128());
Run Code Online (Sandbox Code Playgroud)
我应该采用哪种方法?使用第二种方法比第一种方法会有任何性能改进吗?请注意,我已替换_mm_loadu_si128为两个_mm_loadl_epi64。
AOSP 现在有了新的构建系统,文件在很多地方都Android.bp被替换了Android.mk。
现在我想根据平台有条件地列出源文件。
说这样的话:
if(atom)
{
src: [
.......list of files.......
],
exclude_srcs: [
.......list of files.......
]
} else
{
src: [
.......list of files.......
],
exclude_srcs: [
.......list of files.......
]
}
Run Code Online (Sandbox Code Playgroud)
有什么建议如何实现这一目标?另外,如何在条件中实现诸如 等逻辑NOT运算OR?
提前致谢。
我正在努力优化使用浮点指令的函数。
对于基准测试,我需要了解指令的执行延迟,以了解理论上可能的性能。
但是,我没有找到 A53 的任何此类文档。我错过了什么吗?A53有这样的优化指南吗?