Для кода не-SSE, как было дано в ответе на следующий вопрос ( Нет исключения переполнения для int в C #? ), добавление раздела checked
вокруг добавления, вызывает исключение переполнения при добавлении Int64.MaxValue и1. Однако окружение добавления SSE с разделом checked
, похоже, не вызывает исключения переполнения для long[] arrLong = new long[] { 5, 7, 16, Int64.MaxValue, 3, 1 };
.Я полагаю, что большинство инструкций SSE используют насыщенную математику, где они достигают Int64.MaxValue
и не проходят мимо нее и никогда не переходят к негативам.Есть ли способ в C # вызвать исключение переполнения для добавления SSE, или это невозможно, потому что ЦП может не поддерживать поднятие флага переполнения?
Приведенный ниже код показывает мою реализацию C # SSE суммирования длинных[] используя SSE.Результатом является отрицательное число для вышеприведенного массива, поскольку положительные значения оборачиваются и не насыщаются, поскольку C # должен использовать эту версию инструкции SSE (так как существует две версии: одна, которая упаковывает, и одна, которая насыщает).Не знаю, позволяет ли C # разработчикам выбирать, какую версию использовать.Только часть последовательного кода в приведенном ниже коде вызывает исключение переполнения, но часть SSE - нет.
using System.Numerics;
private static long SumSseInner(this long[] arrayToSum, int l, int r)
{
var sumVector = new Vector<long>();
int sseIndexEnd = l + ((r - l + 1) / Vector<long>.Count) * Vector<long>.Count;
int i;
for (i = l; i < sseIndexEnd; i += Vector<long>.Count)
{
var inVector = new Vector<long>(arrayToSum, i);
checked
{
sumVector += inVector;
}
}
long overallSum = 0;
for (; i <= r; i++)
{
checked
{
overallSum += arrayToSum[i];
}
}
for (i = 0; i < Vector<long>.Count; i++)
{
checked
{
overallSum += sumVector[i];
}
}
return overallSum;
}