algorithm - 在 DWORD 数组中查找最重要的 DWORD

标签 algorithm comparison assembly

我想在 DWORD 数组中找到不等于 0 的最重要的 DWORD。该算法应该针对最大 128 字节的数据大小进行优化。

我做了三个不同的函数,它们都返回特定 DWORD 的索引。

unsigned long msb_msvc(long* dw, std::intptr_t n)
{
    while( --n )
    {
        if( dw[n] )
            break;
    }
    return n;
}

static inline unsigned long msb_386(long* dw, std::intptr_t n)
{
    __asm 
    {
        mov ecx, [dw]
        mov eax, [n]

__loop: sub eax, 1
        jz  SHORT __exit
        cmp DWORD PTR [ecx + eax * 4], 0
        jz  SHORT __loop
__exit:
    }
}

static inline unsigned long msb_sse2(long* dw, std::intptr_t n)
{
    __asm 
    {
        mov  ecx, [dw]
        mov  eax, [n]
        test ecx, 0x0f
        jnz  SHORT __128_unaligned

__128_aligned:
        cmp      eax, 4
        jb       SHORT __64
        sub      eax, 4
        movdqa   xmm0, XMMWORD PTR [ecx + eax * 4]
        pxor     xmm1, xmm1
        pcmpeqd  xmm0, xmm1
        pmovmskb edx, xmm0
        not      edx
        and      edx, 0xffff
        jz       SHORT __128_aligned
        jmp      SHORT __exit

__128_unaligned:
        cmp      eax, 4
        jb       SHORT __64
        sub      eax, 4
        movdqu   xmm0, XMMWORD PTR [ecx + eax * 4]
        pxor     xmm1, xmm1
        pcmpeqd  xmm0, xmm1
        pmovmskb edx, xmm0
        not      edx
        and      edx, 0xffff
        jz       SHORT __128_unaligned
        jmp      SHORT __exit

__64:
        cmp      eax, 2
        jb       __32
        sub      eax, 2
        movq     mm0, MMWORD PTR [ecx + eax * 4]
        pxor     mm1, mm1
        pcmpeqd  mm0, mm1
        pmovmskb edx, mm0
        not      edx
        and      edx, 0xff
        emms
        jz       SHORT __64
        jmp      SHORT __exit

__32:
        test eax, eax
        jz   SHORT __exit
        xor  eax, eax
        jmp  __leave ; retn

__exit:
        bsr      edx, edx
        shr      edx, 2
        add eax, edx

__leave:
    }
}

应该使用这些功能来预选将相互比较的数据。因此,它需要高性能。

有人知道更好的算法吗?

最佳答案

我认为您只是在寻找给定数组中的第一个非零词。我肯定会选择用 C 语言编写的简单循环。如果有某种原因说明这是 super 性能关键,我建议您查看程序的更大上下文并询问例如为什么您需要从数组中找到非零对象以及为什么您不知道它的位置的问题。

关于algorithm - 在 DWORD 数组中查找最重要的 DWORD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5634380/

相关文章:

java - 理解集合排序时的比较方法

mysql - 选择日期在 X 个月内的位置,无论存储的年份如何

c++ - 我必须学习哪种 C++ 才能制作自己的操作系统内核?

c - "--oformat=elf32-i386"有什么用?

javascript - 重复子数组的最大长度(leetcode)

algorithm - 为 Somp 操作设计数据结构

java - 证明 : why does java. lang.String.hashCode() 的实现与其文档相匹配?

python - 我可以使用 « is » 来与静态变量进行比较吗?

C++ 内联程序集运行时检查失败 #0

android - 安卓设备位置图