home bbs files messages ]

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