2009-10-16 28 views
2

我们试图以高性能的方式比较使用不等式操作的signed int值的两个大小相同的本机数组,其中值为<,< =>,>和> =。将许多值进行比较时,true/false结果将会输入相同大小输入的char阵列,其中0x00表示false0xff表示truesigned int数组的高性能比较(使用Intel IPP库)

为了实现这一目标,我们使用了英特尔IPP库。问题在于我们发现从图像和视频处理库中找到的名为ippiCompare_*的操作只支持unsigned charIpp8u),signed/unsigned shortIpp16s/Ipp16u)和floatIpp32f)类型的函数。它不直接支持signed intIpp32s

我(只)设想解决这个的两种可能的方式:

  • 铸造数组的直接支持的类型之一,并执行在多个步骤进行比较(它将成为两倍大小的短阵列或四倍大小的char数组)并合并中间结果。

  • 使用另一个函数直接支持来自IPP或另一个库的signed int数组,可以在性能方面做一些等同的事情。

但是可能有其他创造性的方法......所以我问你是否有帮助! :)

PS:使用英特尔IPP的优势在于大型阵列的性能提升:它同时使用多值处理器功能和多个内核(也许还有更多技巧)。所以简单的环路解决方案不会像快速AFAIK那样做。

PS2:链接,ippiCompare_* doc

回答

1

您可以与PCMPEQD进行比较,然后是PACKUSDW和PACKUSWB。这将是沿东西

#include <emmintrin.h> 

void cmp(__m128d* a, __m128d* b, v16qi* result, unsigned count) { 
    for (unsigned i=0; i < count/16; ++i) { 
     __m128d result0 = _mm_cmpeq_pd(a[0], b[0]); // each line compares 4 integers 
     __m128d result1 = _mm_cmpeq_pd(a[1], b[1]); 
     __m128d result2 = _mm_cmpeq_pd(a[2], b[2]); 
     __m128d result3 = _mm_cmpeq_pd(a[3], b[3]); 
     a += 4; b+= 4; 

     v8hi wresult0 = __builtin_ia32_packssdw(result0, result1); //pack 2*4 integer results into 8 words 
     v8hi wresult1 = __builtin_ia32_packssdw(result0, result1); 

     *result = __builtin_ia32_packsswb(wresult0, wresult1); //pack 2*8 word results into 16 bytes 
     result++; 
    } 
} 

需求保持一致指针,计数被16整除,有些类型转换我已经因为lazyness /愚蠢和可能很多,当然调试,漏报。而且我没有找到packssdw/wb的内在特性,所以我只是使用了我的编译器中的内建函数。

+0

我现在正在检查MMX操作,这似乎是完成我的目标的好方法。在这种情况下,我只是不确定多核的使用情况:它看起来不是“自动地”完成的,对吗? – Chuim 2009-10-19 12:48:15

+0

否。并且由于两个内核共享资源的一部分,如缓存和内存的最后一级,内存带宽很可能成为瓶颈。对于一个如此简单的例程来说,这可能是不值得的。或者更糟糕的是,表现可能因各种原因而受到影响 – hirschhornsalz 2009-10-19 15:22:22

1

我想有一个SSE指令,将比较整数。你看看可以做到这一点的内在因素吗?

0

开箱即用:你确定这是一个性能问题吗?除非您的数据集适合一级缓存,否则您将受到缓存填充限制,并且您在比较操作上花费的实际周期(几乎不可能是缓慢,即使以最天真的方式完成)也不可能限制。

+0

你是对的,对于纯内存操作,内存带宽通常是限制因素。尽管如此,即使对于简单的内存拷贝来说,sse指令也会比“天真”的方式或字符串操作更好,即使只有很小的余地。与简单的方式相比,只有四分之一的执行单元被占用,因此超线程可能会从矢量操作中受益。 另外,如果他有流数据以避免高速缓存污染,他可以选择绕过高速缓存(非暂时性mov指令)。 – hirschhornsalz 2009-10-17 01:56:17

+0

我也会密切关注的;感谢您的建议。无论如何,我们将使用IPP和简单的标量操作在我们正在构建的每个操作的两个版本之间运行比较测试,以确保获得真正的性能提升。 – Chuim 2009-10-19 12:31:12