Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arm 霓虹灯、SSE和交错加载与随机播放_Arm_X86 64_Sse_Neon - Fatal编程技术网

Arm 霓虹灯、SSE和交错加载与随机播放

Arm 霓虹灯、SSE和交错加载与随机播放,arm,x86-64,sse,neon,Arm,X86 64,Sse,Neon,我试图理解“Iwillnotexist Idonotexist”在以下网站上的评论: 。。。为什么不使用映射到VLD3指令的ARM霓虹灯集成电路?这就省去了所有的洗牌,简化和加速了代码。“英特尔SSE”实现需要洗牌,因为它缺少2/3/4路解交错加载指令,但在可用时不应传递这些指令 我遇到的问题是,该解决方案提供的代码是非交错的,并且它在浮点上执行融合乘法。我试图将两者分开,只理解交错加载 根据另一个问题的评论,答案可能是使用VLD3 不幸的是,我只是没有看到它(可能是因为我不太熟悉霓虹灯及其内在

我试图理解“Iwillnotexist Idonotexist”在以下网站上的评论:

。。。为什么不使用映射到VLD3指令的ARM霓虹灯集成电路?这就省去了所有的洗牌,简化和加速了代码。“英特尔SSE”实现需要洗牌,因为它缺少2/3/4路解交错加载指令,但在可用时不应传递这些指令

我遇到的问题是,该解决方案提供的代码是非交错的,并且它在浮点上执行融合乘法。我试图将两者分开,只理解交错加载

根据另一个问题的评论,答案可能是使用
VLD3

不幸的是,我只是没有看到它(可能是因为我不太熟悉霓虹灯及其内在功能)。似乎VLD3基本上为每个输入生成3个输出,所以我的金属模型很混乱

鉴于以下SSE指令对
BGR BGR BGR BGR BGR BGR…
格式的数据进行操作,需要对
bbbbbb gg rrrrr…
进行洗牌:

const byte* data = ...  // assume 16-byte aligned
const __m128i mask = _mm_setr_epi8(0,3,6,9,12,15,1,4,7,10,13,2,5,8,11,14);
__m128i a = _mm_shuffle_epi8(_mm_load_si128((__m128i*)(data)),mask);
我们如何使用NEON内部函数执行交错加载,这样我们就不需要SSE洗牌了



还请注意。。。我对本质感兴趣,而不是ASM。我可以在MSVC、ICC、Clang等下的Windows Phone、Windows Store和Linux驱动设备上使用ARM的内部函数。我不能用ASM来实现这一点,我也不想三次专门化代码(Microsoft 32位ASM、Microsoft 64位ASM和GCC ASM)。

根据本页:

您需要的VLD3内在特性是:

int8x8x3_t  vld3_s8(__transfersize(24) int8_t const * ptr);
// VLD3.8 {d0, d1, d2}, [r0]
如果位于
ptr
所指的地址,则您有以下数据:

0x00: 33221100
0x04: 77665544
0x08: bbaa9988
0x0c: ffddccbb
0x10: 76543210
0x14: fedcba98
您将最终进入注册表:

d0: ba54ffbb99663300
d1: dc7610ccaa774411
d2: fe9832ddbb885522
int8x8x3\u t结构定义为:

struct int8x8x3_t
{
   int8x8_t val[3];
};

根据本页:

您需要的VLD3内在特性是:

int8x8x3_t  vld3_s8(__transfersize(24) int8_t const * ptr);
// VLD3.8 {d0, d1, d2}, [r0]
如果位于
ptr
所指的地址,则您有以下数据:

0x00: 33221100
0x04: 77665544
0x08: bbaa9988
0x0c: ffddccbb
0x10: 76543210
0x14: fedcba98
您将最终进入注册表:

d0: ba54ffbb99663300
d1: dc7610ccaa774411
d2: fe9832ddbb885522
int8x8x3\u t结构定义为:

struct int8x8x3_t
{
   int8x8_t val[3];
};

我也不知道霓虹灯,所以我有兴趣读到它有一个去交错负载。很明显,
vld3
产生三个输出寄存器。您的SSE
pshufb
将数据洗牌为6字节的B,5字节的G,然后5字节的R,全部在一个寄存器中。这与
vld3
提供给您的内容不同,而且似乎不太有用。为什么需要在同一寄存器中混合不同的颜色成分?@PeterCordes-为什么需要在同一寄存器中混合不同的颜色成分。。。“-实际问题是BLAKE2哈希压缩函数。SSE2和SSE4可从以下网址获得:;我们正在削减霓虹灯。我使用另一个堆栈溢出问题作为参考点,以帮助理解和避免混淆。我还猜测,更多的人通过BLAKE2压缩功能了解RGB颜色。“似乎
vld3
基本上为每个输入生成3个输出”-是的,因为输入是指向交错数据的基址。假设指向一个ABCABC数组。。。然后你得到的是一个寄存器,一个充满As,一个充满Bs,一个充满Cs。如果您特别需要一个寄存器来包含aaaaaa bbbbbb ccccc模式,那么我认为无论您如何加载它,您都需要一些
vtbl
排列。我也不知道NEON,所以我有兴趣阅读具有解交织负载的。很明显,
vld3
产生三个输出寄存器。您的SSE
pshufb
将数据洗牌为6字节的B,5字节的G,然后5字节的R,全部在一个寄存器中。这与
vld3
提供给您的内容不同,而且似乎不太有用。为什么需要在同一寄存器中混合不同的颜色成分?@PeterCordes-为什么需要在同一寄存器中混合不同的颜色成分。。。“-实际问题是BLAKE2哈希压缩函数。SSE2和SSE4可从以下网址获得:;我们正在削减霓虹灯。我使用另一个堆栈溢出问题作为参考点,以帮助理解和避免混淆。我还猜测,更多的人通过BLAKE2压缩功能了解RGB颜色。“似乎
vld3
基本上为每个输入生成3个输出”-是的,因为输入是指向交错数据的基址。假设指向一个ABCABC数组。。。然后你得到的是一个寄存器,一个充满As,一个充满Bs,一个充满Cs。如果您特别需要一个寄存器来包含AAAAA BBBBBB CCCCC模式,那么我认为无论您如何加载它,您都需要一些
vtbl
排列。这与原始SSE代码之间唯一显著的区别在于传输的大小。SSE代码似乎要置换128位的数据,而NEON将置换3*64位或3*128位的加载,因此要使其适合原始问题,可能需要一点数据大小调整,以使其适合新的数据大小。这与原始SSE代码之间唯一显著的区别是传输的大小。SSE代码似乎要排列128位的数据,而NEON将要排列3*64位或3*128位的加载,因此要使其适合原始问题,可能需要一点数据大小调整,以使其适合新的数据大小。