0

この投稿SSE ロード/ストア メモリ トランザクションでは、明示的なレジスタ メモリ トランザクションと中間ポインタの違いについて質問しました。実際には、中間ポインタの方がわずかに高いパフォーマンスを示しましたが、ハードウェアの観点から中間ポインタが何であるかは不明です。ポインターが作成された場合、それはいくつかのレジスターも占有されていることを意味しますか、またはレジスターの呼び出しが何らかの SSE 操作 (_mm_mul など) 中に発生することを意味しますか?

例を考えてみましょう:

struct sse_simple
{
    sse_simple(unsigned int InputLength):
        Len(InputLength/4),
        input1((float*)_mm_malloc((float *)_mm_malloc(cast_sz*sizeof(float), 16))),
        input2((float*)_mm_malloc((float *)_mm_malloc(cast_sz*sizeof(float), 16))),
        output((float*)_mm_malloc((float *)_mm_malloc(cast_sz*sizeof(float), 16))),
        inp1_sse(reinterpret_cast<__m128*>(input1)),
        inp1_sse(reinterpret_cast<__m128*>(input2)),
        output_sse(reinterpret_cast<__m128*>(output))
    {}

    ~sse_simple()
    {
        _mm_free(input1);
        _mm_free(input2);
        _mm_free(output);
    }

    void func()
    {
        for(auto i=0; i<Len; ++i)
            output_sse[i] = _mm_mul(inp1_sse[i], inp2_sse[i]);
    }

    float *input1;
    float *input2;
    float *output; 

    __m128 *inp1_sse;
    __m128 *inp2_sse;
    __m128 *output_sse;

    unsigned int Len;
};

上記の例では、中間ポインター inp1_sse、inp2_sse、および output_sse がコンストラクターで 1 回作成されます。大量の sse_simple オブジェクト (たとえば、50,000 以上) を複製すると、レジスターが不足する可能性がありますか?

4

1 に答える 1