現在、C# のみを使用して巨大な配列内のすべての値の合計を計算し、SIMD を使用してパフォーマンスを比較しようとしていますが、SIMD バージョンはかなり遅いです。以下のコード スニペットを参照して、何か不足している場合はお知らせください。「vals」は、画像ファイルから読み取られる巨大な配列であり、無駄を省くためにその部分を省略しています。
var watch1 = new Stopwatch();
watch1.Start();
var total = vals.Aggregate(0, (a, i) => a + i);
watch1.Stop();
Console.WriteLine(string.Format("Total is: {0}", total));
Console.WriteLine(string.Format("Time taken: {0}", watch1.ElapsedMilliseconds));
var watch2 = new Stopwatch();
watch2.Start();
var sTotal = GetSIMDVectors(vals).Aggregate((a, i) => a + i);
int sum = 0;
for (int i = 0; i < Vector<int>.Count; i++)
sum += sTotal[i];
watch2.Stop();
Console.WriteLine(string.Format("Another Total is: {0}", sum));
Console.WriteLine(string.Format("Time taken: {0}", watch2.ElapsedMilliseconds));
および GetSIMDVectors メソッド
private static IEnumerable<Vector<int>> GetSIMDVectors(short[] source)
{
int vecCount = Vector<int>.Count;
int i = 0;
int len = source.Length;
for(i = 0; i + vecCount < len; i = i + vecCount)
{
var items = new int[vecCount];
for (int k = 0; k < vecCount; k++)
{
items[k] = source[i + k];
}
yield return new Vector<int>(items);
}
var remaining = new int[vecCount];
for (int j = i, k =0; j < len; j++, k++)
{
remaining[k] = source[j];
}
yield return new Vector<int>(remaining);
}