Just a sample of the Echomail archive
COMPLANC:
[ << oldest | < older | list | newer > | newest >> ]
|  Message 242,470 of 243,097  |
|  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