Tag: sse2

将每秒字节快速复制到新存储区

我需要一种快速的方法将每个第二个字节复制到一个新的malloc内存区域。 我有一个RGB数据和每通道16位(48位)的原始图像,并希望创建一个每通道8位(24位)的RGB图像。 有没有比按字节复制更快的方法? 我对SSE2了解不多,但我想SSE / SSE2是可能的。

移位n位的__m128i

我有一个__m128i变量,我需要将其n位的128位值移位,即_mm_srli_si128和_mm_slli_si128工作,但是在位而不是字节上。 这样做最有效的方法是什么?

SIMD代码比标量代码运行得慢

elma和elmc都是unsigned long数组。 res1和res1也是如此。 unsigned long simdstore[2]; __m128i *p, simda, simdb, simdc; p = (__m128i *) simdstore; for (i = 0; i > l) & 15; u2 = (elmc[i] >> l) & 15; for (k = 0; k < 20; k++) { //res1[i + k] ^= _mulpre1[u1][k]; //res2[i + k] ^= _mulpre2[u2][k]; simda = _mm_set_epi64x (_mulpre2[u2][k], […]

快速计算两个数组之间的相等字节数

我写了函数int compare_16bytes(__m128i lhs, __m128i rhs) ,以便使用SSE指令比较两个16字节数:此函数返回执行比较后相等的字节数。 现在我想使用上面的函数来比较任意长度的两个字节数组:长度可能不是16字节的倍数,所以我需要处理这个问题。 我怎样才能完成下面这个function的实现? 我怎样才能改进下面的function? int fast_compare(const char* s, const char* t, int length) { int result = 0; const char* sPtr = s; const char* tPtr = t; while(…) { const __m128i* lhs = (const __m128i*)sPtr; const __m128i* rhs = (const __m128i*)tPtr; // compare the next 16 bytes of s […]

SSE指令MOVSD(扩展:x86上的浮点标量和向量运算,x86-64)

我莫名其妙地被MOVSD汇编指令搞糊涂了。 我写了一些计算一些矩阵乘法的数字代码,简单地使用没有SSE内在函数的普通C代码。 我甚至没有包含用于编译的SSE2内在函数的头文件。 但是当我检查汇编器输出时,我看到: 1)使用128位向量寄存器XMM; 2)调用SSE2指令MOVSD。 我知道MOVSD基本上是在单双精度浮点上运行。 它只使用XMM寄存器的低64位并设置高64位0.但我只是不明白两件事: 1)我从不给编译器任何使用SSE2的提示。 另外,我使用GCC而不是英特尔编译器。 据我所知,intel编译器会自动寻找矢量化的机会,但GCC不会。 那么GCC如何知道使用MOVSD? 或者,这个x86指令是否早在SSE指令集之前就已存在,而SSE2中的_mm_load_sd()内在函数只是为了提供向后兼容性来使用XMM寄存器进行标量计算? 2)为什么编译器不使用其他浮点寄存器,无论是80位浮点堆栈还是64位浮点寄存器? 为什么必须使用XMM寄存器(通过设置高64位0并基本上浪费该存储)来收费? XMM是否提供更快的访问? 顺便说一句,我有另外一个关于SSE2的问题。 我只是看不到_mm_store_sd()和_mm_storel_sd()之间的区别。 两者都将较低的64位值存储到地址。 有什么不同? 性能差异?? 对齐差异?? 谢谢。 更新1: 好的,显然当我第一次提出这个问题时,我缺乏一些关于CPU如何管理浮点运算的基本知识。 所以专家倾向于认为我的问题是无意义的。 由于我没有包括最短的样本C代码,人们可能会认为这个问题也很模糊。 在这里,我将提供一个回答作为答案,希望对任何不清楚现代CPU上的浮点运算的人都有用。

快速计算__m128i寄存器中的设置位数

我应该计算__m128i寄存器的设置位数。 特别是,我应该使用以下方法编写两个能够计算寄存器位数的函数。 寄存器的设定位总数。 寄存器的每个字节的设置位数。 是否存在可以完全或部分执行上述操作的内在function?

逻辑SSE内在函数之间有什么区别?

不同类型的逻辑SSE内在函数之间有什么区别吗? 例如,如果我们采用OR运算,有三个内在函数:_mm_or_ps,_mm_or_pd和_mm_or_si128所有这些都做同样的事情:计算其操作数的按位 OR。 我的问题: 使用一个或另一个内在(使用适当的类型转换)之间是否有任何区别。 在某些特定情况下,是否会有更长的执行等隐藏成本? 这些内在函数映射到三个不同的x86指令(por,orps,orpd)。 有没有人有任何想法为什么英特尔浪费宝贵的操作码空间的几个指令做同样的事情?