Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.lang.c    |    Meh, in C you gotta define EVERYTHING    |    243,242 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 242,470 of 243,242    |
|    Bonita Montero to All    |
|    Re: is_binary_file()    |
|    17 Dec 25 07:57:42    |
   
   From: Bonita.Montero@gmail.com   
      
   Am 17.12.2025 um 04:19 schrieb Michael Sanders:   
   > On Tue, 16 Dec 2025 17:24:49 +0100, Bonita Montero wrote:   
   >   
   >> How long have you been dealing with that ? 10 days ?   
   >> I finished the AVX-512 version in C++ in two hours.   
   > As long as I want to.   
   >   
   Here, about 11 times faster than your solution:   
      
   bool asciiAllowedAvx( string_view buf, double prop )   
   {   
    char const   
    *pBegin = buf.data(),   
    *pEnd = pBegin + buf.size();   
    size_t   
    uBegin = (size_t)pBegin,   
    uEnd = (size_t)pEnd,   
    head = uBegin & 63,   
    tail = uEnd & 63;   
    __m512i   
    *p64Begin = (__m512i *)(uBegin - head),   
    *p64End = (__m512i *)((uEnd + 63) & -64);   
    span<__m512i const> range( p64Begin, p64End );   
    __m512i const   
    prnt = _mm512_set1_epi8( (char)0x20 ),   
    cr = _mm512_set1_epi8( (char)'\r' ),   
    lf = _mm512_set1_epi8( (char)'\n' ),   
    tab = _mm512_set1_epi8( (char)'\t' );   
    uint64_t mask = (uint64_t)-1ll << head;   
    ptrdiff_t nFits = 0;   
    auto cur = range.begin(), end = range.end();   
    auto doChunk = [&]()   
    {   
    __m512i chunk = _mm512_loadu_epi8( (void *)to_address( cur ) );   
    uint64_t   
    prntMask = _mm512_cmpge_epu8_mask( chunk, prnt ),   
    crMask = _mm512_cmpeq_epi8_mask( chunk, cr ),   
    lfMask = _mm512_cmpeq_epi8_mask( chunk, lf ),   
    tabMask = _mm512_cmpeq_epi8_mask( chunk, tab );   
    nFits += popcount( (prntMask | crMask | lfMask | tabMask) & mask   
   );   
    };   
    for( ; cur != end - (bool)tail; ++cur, mask = -1ll )   
    doChunk();   
    if( tail )   
    {   
    mask &= ~((uint64_t)-1ll << tail);   
    doChunk();   
    }   
    return 1.0 - (double)nFits / (double)(ptrdiff_t)buf.size() > prop;   
   }   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca