首页 > 解决方案 > 复制“向量”数组:通过 memcpy 还是迭代每个?

问题描述

这是我的一段代码:

for (int oscIndex = 0; oscIndex < kNumOscs; oscIndex++) {
    for (int voiceIndex = 0; voiceIndex < numVoices; voiceIndex += 4) {
        const int v = voiceIndex / 4;

        // vol
        osc[oscIndex][v] = _mm_mul_ps(osc[oscIndex][v], vol[oscIndex][v]);

        // prev output
        mPrevOutput[oscIndex][v] = osc[oscIndex][v];

        // out
        osc[oscIndex][v] = _mm_mul_ps(osc[oscIndex][v], out[oscIndex][v]);
    }
}

以这种方式复制值是否正确mPrevOutput?还是一个(独特的)memcpy会更快?

mPrevOutput并且osc具有相同的长度(在这种情况下,kNumOscs=4 x numVoices=16 x m128)。

我在 Windows/64 位机器上,使用FLAGS += -O3 -march=nocona -funsafe-math-optimizations

这就是它们的定义方式:

alignas(16) std::array<std::array<m128, 4>, kNumOscs> mPrevOutput; // member of a class
m128 osc[4][4]; // declared every time the function's class is executed

标签: c++vectorsimdmemcpy

解决方案


没关系。m128 类型应该使用 SSE 操作,因此分配速度很快。memcpy应该作为内在实现,所以也应该这样做。

但这一切都取决于编译器和编译选项。轮廓,检查拆卸。


推荐阅读