この投稿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 以上) を複製すると、レジスターが不足する可能性がありますか?