Tag: sse

如何将此代码重写为sse内在函数

我是sse内在函数的新手,并希望在使用这个9as时有一些提示帮助,这对我来说还是很模糊) 我有这样的代码 for(int k=0; k>6); int yc0 = 512 + ((idy + k*iddy)>>6); int xc1 = 512 + ((idx + (k+1)*iddx)>>6); int yc1 = 512 + ((idy + (k+1)*iddy)>>6); int xc2 = 512 + ((idx + (k+2)*iddx)>>6); int yc2 = 512 + ((idy + (k+2)*iddy)>>6); int xc3 = 512 + ((idx + (k+3)*iddx)>>6); int yc3 […]

SSE优化代码执行类似于普通版本

我想采取英特尔SSE的第一步,所以我按照这里发布的指南,区别在于我不是为Windows和C ++开发,而是为Linux和C开发(因此我不使用任何_aligned_malloc而是posix_memalign )。 我还实现了一种计算密集型方法,而没有使用SSE扩展。 令人惊讶的是,当我运行程序时,两段代码(一台SSE和一台没有)需要花费相同的时间来运行,通常是使用SSE的时间略高于另一段。 这是正常的吗? GCC是否可能已经使用SSE优化(也使用-O0选项)? 我也尝试过-mfpmath=387选项,但没办法,仍然是一样的。

一些mandelbrot绘制例程从c到sse2

我想重写这样简单的例程到SSE2代码,(最好是在nasm中)我并不完全确定如何做,两件事情不清楚(如何表达计算(内循环和那些来自外循环)以及如何调用c代码函数“SetPixelInDibInt(i,j,palette [n]);”来自staticaly链接的asm代码 void DrawMandelbrotD(double ox, double oy, double lx, int N_ITER) { double ly = lx * double(CLIENT_Y)/double(CLIENT_X); double dx = lx / CLIENT_X; double dy = ly / CLIENT_Y; double ax = ox – lx * 0.5 + dx * 0.5; double ay = oy – ly * 0.5 + dy * 0.5; static […]

在SSE寄存器中随机播放偶数和奇数的vaues

我加载了两个具有16位值的SSE 128位寄存器。 值按以下顺序排列: src[0] = [E_3, O_3, E_2, O_2, E_1, O_1, E_0, O_0] src[1] = [E_7, O_7, E_6, O_6, E_5, O_5, E_4, O_4] 我想要实现的是这样的订单: src[0] = [E_7, E_6, E_5, E_4, E_3, E_2, E_1, E_0] src[1] = [O_7, O_6, O_5, O_4, O_3, O_2, O_1, O_0] 你知道是否有一个很好的方法(使用SSE内在函数直到SSE 4.2)? 我现在卡住了,因为我不能在128位寄存器的上半部分和下半部分之间移动16位值。 我发现只有_mm_shufflelo_epi16和_mm_shufflehi_epi16内在函数。 更新: 感谢Paul,我曾考虑将epi8内在函数用于16位值。 我的解决方案如下: shuffle_split = _mm_set_epi8(15, 14, […]

Websocket数据取消屏蔽/多字节xor

websocket规范将unmasking数据定义为 j = i MOD 4 transformed-octet-i = original-octet-i XOR masking-key-octet-j 其中mask是4个字节长,每个字节必须应用unmasking。 有没有办法更有效地做到这一点,而不仅仅是循环字节? 运行代码的服务器可以假定为Haswell CPU,OS是内核> 3.2的Linux,因此SSE等都存在。 编码是在C语言中完成的,但如果需要,我也可以执行asm。 我试图自己查找解决方案,但是无法弄清楚是否有任何SSE1-5 / AVE /中的任何一个都有适当的指令(无论多少扩展 – 多年来失去了很多轨道) 非常感谢你! 编辑:重新阅读规范几次之后,似乎它实际上只是用掩码字节对数据字节进行异或,我可以一次做8个字节,直到最后几个字节。 问题仍然存在,因为我认为可能仍然有一种方法可以使用SSE等来优化它(可能一次只处理16个字节?让进程执行for循环?…)

在声明时初始化一个联合数组

我正在尝试在声明时初始化以下union数组: typedef union { __m128d m; float f[4]; } mat; mat m[2] = { {{30467.14153,5910.1427,15846.23837,7271.22705}, {30467.14153,5910.1427,15846.23837,7271.22705}}}; 但是我发现了以下错误: matrix.c: In function ‘main’: matrix.c:21: error: incompatible types in initialization matrix.c:21: warning: excess elements in union initializer matrix.c:21: warning: (near initialization for ‘m[0]’) matrix.c:21: warning: excess elements in union initializer matrix.c:21: warning: (near initialization for ‘m[0]’) matrix.c:21: warning: […]

通过非常数除数进行矢量化整数除法的最快方法

基于这个问题的答案/评论,我用gcc 4.9.2(MinGW64)编写了一个性能测试来估计多个整数除法的哪种方式更快,如下: #include // SSE2 static unsigned short x[8] = {0, 55, 2, 62003, 786, 5555, 123, 32111}; // Dividend __attribute__((noinline)) static void test_div_x86(unsigned i){ for(; i; –i) x[0] /= i, x[1] /= i, x[2] /= i, x[3] /= i, x[4] /= i, x[5] /= i, x[6] /= i, x[7] /= i; } __attribute__((noinline)) static […]

与astype(int)相比,numpy around / rint slow

所以,如果我有像x=np.random.rand(60000)*400-200 。 iPython的%timeit说: x.astype(int)需要0.14ms np.rint(x)和np.around(x)需要1.01ms 请注意,在rint和around情况下,您仍然需要花费额外的0.14ms来做最终的astype(int) (假设这是你最终想要的)。 问题:我认为大多数现代硬件都能够在同等时间内完成两项操作。 如果是这样的话,为什么numpy需要花费8倍的时间来进行舍入? 碰巧我对算术的准确性并不十分挑剔,但我看不出如何利用numpy(我正在做杂乱的生物学而不是粒子物理学)。

如何并行比较两个以上的数字?

是否可以使用SSE4在一条指令中比较一对以上的数字? 英特尔参考咨询有关PCMPGTQ的内容如下 PCMPGTQ – 比较大于的打包数据 对目标操作数(第一个操作数)和源操作数(第二个操作数)中的压缩四字进行SIMD比较。 如果第一个(目标)操作数中的数据元素大于第二个(源)操作数中的相应元素,则目标中的相应数据元素将设置为全1; 否则,设置为0。 这不是我想要的,因为我希望能够决定哪个整数更大,哪个整数更小。 例如,如果我需要比较 32 with 45 13 with 78 44 with 12 99 with 66 我打算将[32, 13, 44, 99]放在一个向量中,将[45, 78, 12, 66]放在另一个向量中,并在一条指令中使用SSE4进行比较,得到[0, 0, 1, 1] 0,0,1,1 [0, 0, 1, 1]结果(0 – 少,1 – 更大) 但似乎这不是PCMPGTQ所做的。 有关如何在此级别使用并行性来加速此比较的任何建议?

使用向量扩展时让GCC生成PTEST指令

当使用C的GCC向量扩展时,如何检查向量上的所有值是否为零? 例如: #include typedef uint32_t v8ui __attribute__ ((vector_size (32))); v8ui* foo(v8ui *mem) { v8ui v; for ( v = (v8ui){ 1, 1, 1, 1, 1, 1, 1, 1 }; v[0] || v[1] || v[2] || v[3] || v[4] || v[5] || v[6] || v[7]; mem++) v &= *(mem); return mem; } SSE4.2具有PTEST指令,允许运行类似于for条件的测试for但GCC生成的代码只是解包向量并逐个检查单个元素: .L2: vandps (%rax), […]