Используя SSE в c# это возможно?

Я прочитал все ответы, здесь что-то очень важное отсутствует, я ПОКУПАЮ. Есть две основные причины: почему мне нужны самозаверяющие анонимные функции или лучше сказано «Выражение с немедленной вызывной функцией (IIFE)»:

  1. Лучшее управление пространством имен (Избегание загрязнения пространства имен -> Модуль JS )
  2. Закрытие (имитация членов частного класса, как известно из ООП)

Первое объяснено очень хорошо. Для второго, пожалуйста, изучите следующий пример:

var MyClosureObject = (function (){
  var MyName = 'Michael Jackson RIP';
  return {
    getMyName: function () { return MyName;},
    setMyName: function (name) { MyName = name}
  }
}());

Внимание 1: Мы не назначаем функцию MyClosureObject, что еще раз является результатом вызова этой функции. Помните () в последней строке.

Внимание 2: Что вам дополнительно нужно знать о функциях в Javascript, так это то, что внутренние функции получают доступ к параметрам и переменным функций, которые они определены внутри.

Пусть мы попробуем несколько экспериментов:

Я могу получить MyName с помощью getMyName, и он работает:

 console.log(MyClosureObject.getMyName()); 
 // Michael Jackson RIP

Следующий хитроумный подход не сработает:

console.log(MyClosureObject.MyName); 
// undefined

Но я могу установить другое имя и получить ожидаемый результат:

MyClosureObject.setMyName('George Michael RIP');
console.log(MyClosureObject.getMyName()); 
// George Michael RIP

Изменить: В приведенном выше примере MyClosureObject предназначен для использования без префикса new, поэтому конвенции он не должен быть капитализирован.

15
задан Rex Logan 6 January 2009 в 03:44
поделиться

6 ответов

Предстоящие Моно 2,2 выпуска будут иметь поддержку SIMD. Miguel de Icaza, занесенный в блог о предстоящей функции здесь и API, здесь.

Хотя будет библиотека, которая будет поддерживать разработку под временем выполнения Windows.NET Microsoft, она не будет иметь выигрышей в производительности, которые Вы ищете, если Вы не выполняете код под Моно временем выполнения. Который мог бы быть выполнимым в зависимости от Ваших обстоятельств.

Обновление: Выпущены моно 2.2

17
ответ дан 1 December 2019 в 00:50
поделиться

C# может явно выполнить вызов SSE?

Нет. C# не может произвести встроенный IL намного меньше встроенного x86/amd64 блока.

CLR и более конкретно JIT, будут использовать SSE, если это будет доступное удаление потребности вызвать его при большинстве обстоятельств. Я говорю больше всего, потому что я не эксперт SSE, и я уверен, что существуют случаи, где это могло быть выгодно, и JIT не делает оптимизацию.

7
ответ дан 1 December 2019 в 00:50
поделиться

На основе этой регистрации форума JIT-компилятор MS автоматически использует SSE, если SSE доступен на целевой машине.

4
ответ дан 1 December 2019 в 00:50
поделиться

Если у Вас есть 'блок' работы, Вы хотите сделать, лучший выбор состоит в том, чтобы записать это в C++ с помощью MMX/SSE intrinsics и затем заставить очень простой / сбросить класс управляемого С++, который переносит функциональность и выставляет ее как класс .NET. Затем Ваш код может просто использовать тот блок, как будто это был нормальный класс.

Для больше о VC intrinsics можно посмотреть на эту небольшую частушку, которую я записал много лет назад.

http://msdn.microsoft.com/en-us/library/0aws1s9k.aspx

О - я предполагаю, что Вы на самом деле желаете использовать параллельные функции для ускорения чего-то. Как другие указали - если Вы просто хотите переместить данные в большие блоки и т.п., JIT уже знает, как использовать SSE для тех основ.

2
ответ дан 1 December 2019 в 00:50
поделиться

Современные Поддержки C# инструкции SIMD/SSE хорошо и делают их довольно простыми использовать. Не все инструкции все же поддерживаются.

Вот пример SSE.Sum () массива uint []:

    using System.Numerics;

    private static ulong SumSseInner(this uint[] arrayToSum, int l, int r)
    {
        var sumVectorLower = new Vector<ulong>();
        var sumVectorUpper = new Vector<ulong>();
        var longLower      = new Vector<ulong>();
        var longUpper      = new Vector<ulong>();
        int sseIndexEnd = l + ((r - l + 1) / Vector<uint>.Count) * Vector<uint>.Count;
        int i;
        for (i = l; i < sseIndexEnd; i += Vector<int>.Count)
        {
            var inVector = new Vector<uint>(arrayToSum, i);
            Vector.Widen(inVector, out longLower, out longUpper);
            sumVectorLower += longLower;
            sumVectorUpper += longUpper;
        }
        ulong overallSum = 0;
        for (; i <= r; i++)
            overallSum += arrayToSum[i];
        sumVectorLower += sumVectorUpper;
        for (i = 0; i < Vector<long>.Count; i++)
            overallSum += sumVectorLower[i];
        return overallSum;
    }

Эта конкретная функция является частью и бесплатного пакета самородка с открытым исходным кодом, HPCsharp, доступного на nuget.org, который я поддерживаю.

1
ответ дан 1 December 2019 в 00:50
поделиться

Уверенный Вы можете (более важный вопрос быть - почему был бы Вы? Просто оставьте это времени выполнения; это - его задание).

C# позволяет Вам отобразить делегата в адресе памяти. Тот адрес памяти может содержать необработанные ассемблерные коды. Можно читать больше на блоге Michael Giagnocavo.

Хотя я не судил меня, может быть возможно использовать Маршала. GetDelegateForFunctionPointer также.

0
ответ дан 1 December 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: