少なくとも標準の for ループとして実行する C++ でストライド メモリ コピーを効率的に実行する方法はありますか?
編集 2: C++ ライブラリにはストライド コピーの機能はありません。
ストライド コピーはメモリ コピーほど一般的ではないため、チップ メーカーや言語設計では、ストライド コピーを特別にサポートしています。
標準的なループを想定すると、ループ展開for
を使用することでパフォーマンスを向上できる場合があります。一部のコンパイラには、ループを展開するオプションがあります。これは「標準」オプションではありません。
標準 for
ループを考えると:
#define RESULT_SIZE 72
#define SIZE_A 48
#define SIZE_B 24
unsigned int A[SIZE_A];
unsigned int B[SIZE_B];
unsigned int result[RESULT_SIZE];
unsigned int index_a = 0;
unsigned int index_b = 0;
unsigned int index_result = 0;
for (index_result = 0; index_result < RESULT_SIZE;)
{
result[index_result++] = B[index_b++];
result[index_result++] = A[index_a++];
result[index_result++] = A[index_a++];
}
ループ展開は、「標準」for
ループ の内容を繰り返します。
for (index_result = 0; index_result < RESULT_SIZE;)
{
result[index_result++] = B[index_b++];
result[index_result++] = A[index_a++];
result[index_result++] = A[index_a++];
result[index_result++] = B[index_b++];
result[index_result++] = A[index_a++];
result[index_result++] = A[index_a++];
}
アンロールバージョンでは、ループの数が半分に削減されています。
パフォーマンスの向上は、他のオプションと比較して無視できる場合があります。次の問題はパフォーマンスに影響を与え、それぞれ速度の向上が異なる場合があります。
- データキャッシュミスの処理
- 命令パイプラインのリロード (プロセッサに依存)
- オペレーティング システムのメモリとディスクのスワッピング
- 同時に実行されている他のタスク
- 並列処理 (プロセッサ/プラットフォームに依存)
並列処理の 1 つの例は、1 つのプロセッサが B 項目を新しい配列にコピーし、別のプロセッサが A 項目を新しい配列にコピーすることです。