Нет исключения переполнения для длинного / длинного добавления SSE в C #? - PullRequest
0 голосов
/ 04 июля 2019

Для кода не-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;
    }
...