Tag: sse

SSE对冲浮标练习

在处理SSE(AVX)中的整数和浮点数时,将所有整数转换为浮点数并仅使用浮点数是一个好习惯吗? 因为之后我们只需要一些SIMD指令,而我们需要使用的是添加和比较指令( <, <=, == ),我希望这种转换应该完全保留。

C风格演员与内在演员

假设我已经定义了__m256d x并且我想要提取较低的128位。 我会做: __m128d xlow = _mm256_castpd256_pd128(x); 但是,我最近看到有人这样做: __m128d xlow = (__m128d) x 是否有首选方法用于演员表? 为什么要使用第一种方法?

使用sse内在函数时如何摆脱循环?

__m128* pSrc1 = (__m128*) string; __m128 m0 = _mm_set_ps1(0); //null character while(1) { __m128 result = __m128 _mm_cmpeq_ss(*pSrc1, m0); //if character is \0 then break //do some stuff here pSrc1++; } 我有一个字符串,其长度可以是16的倍数。如果_mm_cmpeq_ss返回相等,我如何突破循环?

在`C`函数中定义`static const` SIMD变量

我有这种forms的函数(使用SSE从指数函数的最快实现 ): __m128 FastExpSse(__m128 x) { static __m128 const a = _mm_set1_ps(12102203.2f); // (1 << 23) / ln(2) static __m128i const b = _mm_set1_epi32(127 * (1 << 23) – 486411); static __m128 const m87 = _mm_set1_ps(-87); // fast exponential function, x should be in [-87, 87] __m128 mask = _mm_cmpge_ps(x, m87); __m128i tmp = _mm_add_epi32(_mm_cvtps_epi32(_mm_mul_ps(a, […]

紧凑型AVX2寄存器,因此根据掩码选择的整数是连续的

在优化arrays压缩的问题中,最佳答案指出: 具有最新指令集的SSE / AVX寄存器允许更好的方法。 我们可以直接使用PMOVMSKB的结果,将其转换为PSHUFB之类的控制寄存器。 Haswell(AVX2)可以实现吗? 或者它需要AVX512的一种口味? 我有一个包含int32s的AVX2向量,以及一个比较结果的相应向量。 我想以某种方式将其改组,以便在掩码中设置相应msb的元素(比较true)在向量的低端是连续的。 我能看到的最好的是使用_mm256_movemask_ps / vmovmskps(没有* d变体?)得到一个掩码,然后在256 AVX2向量查找表中使用它来获得跨通道_m256_permutevar8x32_epi32 / vpermd的随机掩码

用SSE计算平均4d向量

我尝试加速计算放置在数组中的4d向量的平均值。 这是我的代码: #include #include #include #include #include #include typedef float dot[4]; #define N 1000000 double gettime () { struct timeval tv; gettimeofday (&tv, 0); return (double)tv.tv_sec + (0.000001 * (double)tv.tv_usec); } void calc_avg1 (dot res, const dot array[], int n) { int i,j; memset (res, 0, sizeof (dot)); for (i = 0; i < n; […]

SSE加载和添加

假设我有两个向量由两个double类型的数组表示,每个数组大小为2.我想添加相应的位置。 因此假设向量i0和i1 ,我想将i0[0] + i1[0]和i0[1] + i1[1]在一起。 由于类型是double ,我需要两个寄存器。 诀窍是将i0[0]和i1[0] ,以及i0[1]和i1[1]放在另一个中,只需添加寄存器即可。 我的问题是,如果我调用_mm_load_ps(i0[0])然后_mm_load_ps(i1[0]) ,它会将它们分别置于低位和高位64位,还是会用第二次load替换寄存器? 如何将两个双打放在同一个寄存器中,以便我可以在之后调用add_ps ? 谢谢,

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

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

由于不正确的内存对齐,使用SSE内在函数时出现分段错误

我第一次使用SSE内在函数,即使确保了16byte内存对齐,我也遇到了分段错误。 这篇文章是我之前问题的扩展: 如何分配16byte内存对齐数据 这是我声明我的数组的方式: float *V = (float*) memalign(16,dx*sizeof(float)); 当我尝试这样做时: __m128 v_i = _mm_load_ps(&V[i]); //It works 但是当我这样做时: __m128 u1 = _mm_load_ps(&V[(i-1)]); //There is a segmentation fault 但如果我这样做: __m128 u1 = _mm_loadu_ps(&V[(i-1)]); //It works again 但是我想消除使用_mm_loadu_ps并希望仅使用_mm_load_ps使其工作。 我正在使用Intel icc编译器。 我该如何解决这个问题? 更新: 使用以下代码中的两个操作: void FDTD_base (float *V, float *U, int dx, float c0, float c1, float c2, float […]

仅使用SSE2提取SSE混洗32位值

我试图以有效的方式从128位寄存器中提取4个字节。 问题是每个值都是32 {120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0} 。 我想将128位变换为32位,forms为{120,55,42,120} 。 “原始”代码如下所示: __m128i byte_result_vec={120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0}; unsigned char * byte_result_array=(unsigned char*)&byte_result_vec; result_array[x]=byte_result_array[0]; result_array[x+1]=byte_result_array[4]; result_array[x+2]=byte_result_array[8]; result_array[x+3]=byte_result_array[12]; 我的SSSE3代码是: unsigned int * byte_result_array=…; __m128i byte_result_vec={120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0}; const __m128i eight_bit_shuffle_mask=_mm_set_epi8(1,1,1,1,1,1,1,1,1,1,1,1,0,4,8,12); byte_result_vec=_mm_shuffle_epi8(byte_result_vec,eight_bit_shuffle_mask); unsigned int * byte_result_array=(unsigned int*)&byte_result_vec; result_array[x]=byte_result_array[0]; 我怎样才能有效地使用SSE2。 SSSE3或SSE4有更好的版本吗?