如果我在SSE或AVX寄存器中打包了一些指针或类似指针的值,是否有任何特别有效的方法将它们解引用到另一个此类寄存器中?(“特别有效”的意思是“比仅对值使用内存更有效”。)是否有任何方法可以在不将寄存器的中间副本写入内存的情况下全部取消引用它们?
为澄清起见进行编辑:这意味着,假设使用32位指针和SSE,使用XMM寄存器的四个部分立即将其索引到四个任意存储区中,并将四个结果立即返回到另一个寄存器中。或尽可能接近“一次”。(/编辑)
Edit2:感谢PaulR的回答,我想我要寻找的术语是“收集”,因此问题是“在AVX2之前的系统中实现收集的最佳方法是什么?”。
我假设没有关于此的指令,因为……据我所知,似乎还不存在,而且似乎它根本不是SSE所设计的。
(“类似指针的值”的含义类似于假装为堆的数组中的整数索引;在机械上非常不同,但从概念上讲是相同的。例如,如果要使用32位或什至16位值,而无论本机指针大小,以适应寄存器中的更多值。)
我想到了为什么可能要这样做的两个可能原因:
认为探索将SSE寄存器用于通用...可能很有意思...也许有四个相同的“线程”处理可能完全不相关/不连续的数据,“垂直”而不是“水平”地切分寄存器(即代替设计使用它们的方式)。
这听起来像是XY问题,但并非如此,只是好奇/愚蠢。拿到锤子后,我会去找钉子。
这个问题尚不完全清楚,但是如果要取消引用向量寄存器元素,那么唯一可能对您有帮助的指令就是AVX2收集的负载,例如_mm256_i32gather_epi32
et al。请参阅《英特尔内在指南》的“ AVX2”部分。
SYNOPSIS
__m256i _mm256_i32gather_epi32 (int const* base_addr, __m256i vindex, const int scale)
#include "immintrin.h"
Instruction: vpgatherdd ymm, vm32x, ymm
CPUID Flag : AVX2
DESCRIPTION
Gather 32-bit integers from memory using 32-bit indices. 32-bit elements are loaded from addresses starting at base_addr and offset by each 32-bit element in vindex (each index is scaled by the factor in scale). Gathered elements are merged into dst. scale should be 1, 2, 4 or 8.
OPERATION
FOR j := 0 to 7
i := j*32
dst[i+31:i] := MEM[base_addr + SignExtend(vindex[i+31:i])*scale]
ENDFOR
dst[MAX:256] := 0
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句