Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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
C 4字节单位流与3字节单位流之间的转换_C_Assembly_Compiler Optimization - Fatal编程技术网

C 4字节单位流与3字节单位流之间的转换

C 4字节单位流与3字节单位流之间的转换,c,assembly,compiler-optimization,C,Assembly,Compiler Optimization,我有一个问题 这里有一个关于一个更一般化的问题,这个问题有一个可能的解决方案 流1由4字节单元组成: B0.0 B0.1 B0.2 B0.3 B1.0 B1.1 B1.2 B1.3 流2由3个字节单元组成: B0.0 B0.1 B0.2 B1.0 B1.1 B1.2 在他们之间转换和返回的高效方式是什么 (1) 一些汇编问题表明,在许多类似这样的简单情况下,编译器可以更好地完成这项工作,如何编写C代码以让编译器实现最佳优化 (1.1)扩展:在回路中处理多个装置 (1.2)直接对字节进行操作,或者

我有一个问题

这里有一个关于一个更一般化的问题,这个问题有一个可能的解决方案

流1由4字节单元组成:

B0.0 B0.1 B0.2 B0.3 B1.0 B1.1 B1.2 B1.3

流2由3个字节单元组成:

B0.0 B0.1 B0.2 B1.0 B1.1 B1.2

在他们之间转换和返回的高效方式是什么

(1) 一些汇编问题表明,在许多类似这样的简单情况下,编译器可以更好地完成这项工作,如何编写C代码以让编译器实现最佳优化

(1.1)扩展:在回路中处理多个装置

(1.2)直接对字节进行操作,或者通过逻辑运算对较大的数据进行操作,哪一个更好


(2) X86汇编:是否有向量指令可以在多个单元上执行这种类型的打包和解包操作?

是的,您可以使用SSSE3
pshufb
\u mm\u shuffle\u epi8
,读取16个字节,写入12个字节(实际上是16个未对齐的字节,在输出流中与前一个向量重叠4个字节)。如果没有SSSE3,那么做可能不值得;为此,您需要标量dword加载和重叠dword存储。(不是3倍字节加载/存储!)IDK如果四大编译器中的任何一个将为您自动矢量化,无论您是以
uint32_t
加载并与
memcpy
重叠的3字节存储,还是作为单独的字节加载和存储。看起来gcc将:找到哪个包(并反转)。您可以将洗牌向量更改为仅打包。(另一个方向是。)@NateEldredge:Oh-wow,GCC不只是做重叠存储,而是在向量之间洗牌数据,这样它就可以在目标中进行完整的16字节存储。有趣。这可能无利可图,可能会限制随机端口带宽,使用6
pshufb
输出3x16字节。这是每个pshufb 8个字节的输出,而正常重叠方式是每个pshufb 12个字节。因此,这并不可怕,如果您在L3中出错,它可能会保持内存。是的,您可以使用SSSE3
pshufb
\u mm\u shuffle\u epi8
,读取16个字节,写入12个字节(实际上是16个未对齐的字节,在输出流中与前一个向量重叠4个字节)。如果没有SSSE3,那么做可能不值得;为此,您需要标量dword加载和重叠dword存储。(不是3倍字节加载/存储!)IDK如果四大编译器中的任何一个将为您自动矢量化,无论您是以
uint32_t
加载并与
memcpy
重叠的3字节存储,还是作为单独的字节加载和存储。看起来gcc将:找到哪个包(并反转)。您可以将洗牌向量更改为仅打包。(另一个方向是。)@NateEldredge:Oh-wow,GCC不只是做重叠存储,而是在向量之间洗牌数据,这样它就可以在目标中进行完整的16字节存储。有趣。这可能无利可图,可能会限制随机端口带宽,使用6
pshufb
输出3x16字节。这是每个pshufb 8个字节的输出,而正常重叠方式是每个pshufb 12个字节。所以这并不可怕,如果你错过了L3,它可能会保持记忆。