草庐IT

c++ - 使用 AVX2 将 8 位从 32 位值 (__m256i) 解压到 __m256 的最快方法

我有一个名为A的数组,它包含32个unsignedchar值。我想使用此规则将这些值解压缩到4个__m256变量中,假设我们有一个从0到31的索引,关于A中的所有值,解压缩的4变量将具有这些值:B_0=A[0],A[4],A[8],A[12],A[16],A[20],A[24],A[28]B_1=A[1],A[5],A[9],A[13],A[17],A[21],A[25],A[29]B_2=A[2],A[6],A[10],A[14],A[18],A[22],A[26],A[30]B_3=A[3],A[7],A[11],A[15],A[19],A[23],A[27],A[31]为此,我有

c++ - shuffle/permute 内在函数如何为 256 位 pd 工作?

我正在努力思考_mm256_shuffle_pd和_mm256_permute_pd内在函数的工作原理。我似乎无法预测其中一项操作的结果。首先,_mm_shuffle_ps一切正常。我得到的结果是我所期望的。例如:floatb[4]={1.12,2.22,3.33,4.44};__m128a=_mm_load_ps(&b[0]);a=_mm_shuffle_ps(a,a,_MM_SHUFFLE(3,0,1,2));_mm_store_ps(&b[0],a);//3.332.221.124.44所以一切都在这里。现在我想用我目前在我的代码中使用的__m256d来尝试这个。据我发现,_mm

c++ - SIMD:实现 _mm256_max_epu64_ 和 _mm256_min_epu64_

我想问一个关于SIMD的问题。我的CPU中没有AVX512但想要一个_mm256_max_epu64.我们如何用AVX2实现这个功能?在这里,我尝试拥有我的微不足道的。也许我们可以将其作为讨论并加以改进。#defineSIMD_INLINEinline__attribute__((always_inline))SIMD_INLINE__m256i__my_mm256_max_epu64_(__m256ia,__m256ib){uint64_t*val_a=(uint64_t*)&a;uint64_t*val_b=(uint64_t*)&b;uint64_te[4];for(size_t

c++ - 什么是非时间流加载固有 (_mm256_stream_load_si256) 的浮点 (__m256d) 版本?

在AVX/AVX2中我只能找到_mm256_stream_load_si256(),用于__m256i。没有办法流式加载__m256d吗?为什么?(我想在不污染CPU缓存的情况下加载它)做下面的(aggressivecasting)有什么障碍吗?__m256d*pDest=/*...*/;__m256d*pSrc=/*...*/;/*...*/const__m256iiWeight=_mm256_stream_load_si256(reinterpret_cast(pSrc));const__m256dprior=_mm256_div_pd(*reinterpret_cast(&iWe

c++ - 使用 `__m256i` 中的值高效访问数组 - SIMD

关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭5年前。Improvethisquestion比方说,我有2个变量__m256i,名为rows和cols,它们里面的值是:rows:0,2,7,5,7,2,3,0cols:1,2,7,5,7,2,2,6现在,这些值代表8个点的x和y位置,因此,在这种情况下,我会有这些点:p0:[0,1],p1:[2,2],p2:[7,7],p3:[5,5]p4:[7,7],p5:[2,2],p6:[3,2],p7:[0,6]我还有一个名为lut的数组,它将具

c++ - 256如何存储在char变量和unsigned char中

最多255,我能理解整数是如何存储在char和unsignedchar中的;#includeintmain(){unsignedchara=256;printf("%d\n",a);return(0);}在上面的代码中,我为unsignedchar和char输出了0。对于256,我认为这是整数在代码中的存储方式(这只是一个猜测):首先256转换为二进制表示为100000000(共9位)。然后他们删除了最左边的位(已设置的位),因为char数据类型只有8位内存。所以它在内存中存储为00000000,这就是它打印0作为输出的原因。猜测是否正确或有其他解释? 最佳

两次计算SHA256-什么?

我试图了解比特币协议,有时会看到这样的说明:TransActionID由SHA256(SHA256(TXBYTES))定义或者公共密钥的哈希是通过在公共密钥上执行sha256哈希来生成的,然后用大端符号对结果进行RIPEMD160哈希。该功能看起来像这样:RIPEMD160(SHA256(PubKey))哈希算术两次是出于什么目的?看答案“两次哈希的常见理由是防止哈希的长度扩展属性"在这里完整答案https://crypto.stackexchange.com/questions/50017/why-hashing-twice

c++ - 未解析的外部符号 __mm256_setr_epi64x

我已经用g++编写和调试了一些AVX代码,现在我正试图让它与MSVC一起工作,但我不断得到errorLNK2019:unresolvedexternalsymbol__mm256_setr_epi64xreferencedinfunction"private:union__m256i__thiscallavx_matrix::avx_bit_mask(unsignedint)const"(?avx_bit_mask@avx_matrix@@ABE?AT__m256i@@I@Z)引用的代码是...#include.../*Allzerosexceptforpos-thposition(0

C++ 套接字 256 字节缓冲区

我正在尝试使用C++中的一些套接字网络编程。我正在尝试发送文本“HelloWorld!”使用C++send()函数发送到服务器。起初,我将缓冲区的大小设置为13,因为“HelloWorld!”总共是12个字符(你必须使它比字符数多一个)。如果我发送大约7次,发送功能只会将字符发送到服务器。当它最终到达服务器时,它看起来像这样:“HelloWorld!HelloWorld!HelloWorld!HelloWorld!HelloWorld!HelloWorld!HelloWorld!”现在是有趣的部分。“HelloWorld!”如果我将缓冲区大小设置为256(charbuffer[256]

c++ - 如何在 C/C++ 中执行 _mm256_maskstore_epi8()?

问题我想做的是,如果我有一个27(不是32!)的vectorint8_t:x={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26}我想首先将它向右循环移位n(不是常数),例如如果n=1:x2={26,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25}然后这个vector被用来做一些非常复杂的计算,但是为了简单起见,我们假设下一步只是将它循环左移n,然后存入内存。所以我应该有一个新的vector27int8_t: