C++ _mm_set_epi64x,valgrind报告未初始化

C++ _mm_set_epi64x,valgrind报告未初始化,c++,valgrind,sse,C++,Valgrind,Sse,使用\u mm\u set\u epi64x()设置valgrind时,我的行为与内在的\u m128i相结合,出现了奇怪的行为。设置变量后,valgrind将其报告为未初始化。以下是违规代码 for (u64 i = 0; i < mIndexArray.size(); ++i) { //reinterpret_cast<u64*>(&mIndexArray[i])[0] = mBlockIdx++; //reinter

使用
\u mm\u set\u epi64x()
设置valgrind时,我的行为与内在的
\u m128i
相结合,出现了奇怪的行为。设置变量后,valgrind将其报告为未初始化。以下是违规代码

    for (u64 i = 0; i < mIndexArray.size(); ++i)
    {
        //reinterpret_cast<u64*>(&mIndexArray[i])[0] = mBlockIdx++;
        //reinterpret_cast<u64*>(&mIndexArray[i])[1] = 0;

        mIndexArray[i] = _mm_set_epi64x(mBlockIdx++, 0);
        Log::out << mIndexArray[i] << " ";
    }
(u64 i=0;ifor { //重新解释cast(&mIndexArray[i])[0]=mBlockIdx++; //重新解释(mIndexArray[i])[1]=0; mIndexArray[i]=_mm_set_epi64x(mBlockIdx++,0);
Log::out可以尝试
\uuuum128i\umm\ucvtsi64\u si128(\uuuu int64 a)
更直接地告诉编译器您想要
movq
将整数放入向量寄存器(将上64b置零)。希望您的真实代码能够在生成数据的过程中动态处理数据,这只是一个MCVE,可以毫无悬念地演示问题。谢谢Peter,但不幸的是,这没有帮助。关于动态计算,向量很短,然后AES会被全部调用。因此,我认为它相当有效。也许可以将其归为false肯定?re:效率。是的,可能不值得复制代码来对刚生成的数据使用AES内部函数,只要向量明显小于32kiB(英特尔的一级缓存大小)。我认为AMD推土机系列只使用16k L1缓存。Re:valgrind:没有线索,我自己没有使用过valgrind。我个人不会使用
\um128i
数组。我会使用
u64
数组,然后执行
\um128i tmp=\umm\u set\u epi64x(mBlockIdx++,0);\umm\u storeu si128((\uu m128i*)&exarray[2*mindi],tmp)
。不过,我决不会在关键循环中使用
\u mm\u set\u epi64x