23. C#でHardware Intrinsics (2)
• コードの書き方
using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.X86;
result = Sse.Multiply(Sse.Shuffle(a, a, 0x00), Sse.LoadVector128(p
result = Sse.Add(result, Sse.Multiply(Sse.Shuffle(a, a, 0x55), Sse
result = Sse.Add(result, Sse.Multiply(Sse.Shuffle(a, a, 0xaa), Sse
result = Sse.Add(result, Sse.Multiply(Sse.Shuffle(a, a, 0xff), Sse
・・・
命令セットの
名前のクラス
命令に対応
するメソッド
37. C# 7.2: 安全なstackalloc
• 例: 頻出数字の検索
static int MostFrequentDigit(string s)
{
var digits = new int[10];
foreach (var c in s)
{
var d = c - '0';
if ((uint)d < 10) ++digits[d];
}
var max = 0;
for (int i = 1; i < 10; i++)
if (digits[max] < digits[i]) max = i;
return max;
}
0~9の文字の頻度をカウント
するための一時バッファー
配列のせいでヒープ確保
(あんまり好ましくない)
38. C# 7.2: 安全なstackalloc
• 例: 頻出数字の検索
static int MostFrequentDigit(string s)
{
Span<int> digits = stackalloc int[10];
foreach (var c in s)
{
var d = c - '0';
if ((uint)d < 10) ++digits[d];
}
var max = 0;
for (int i = 1; i < 10; i++)
if (digits[max] < digits[i]) max = i;
return max;
}
一時バッファーをnewから
stackallocに変更
ヒープ確保がなくなる
(速い)
unsafe不要
実際、安全
• 範囲チェックあり
• 外に返せないルールあり