C# Монте-Карло Возрастающая оптимизация Вычисления Риска, случайные числа, параллельны выполнению

Эта статья объясняет относительно простые 7 правила, которые позволят Вам считать любое объявление C, если Вы будете желать или должными быть сделать так вручную: http://www.ericgiguere.com/articles/reading-c-declarations.html

  1. Находит идентификатор. Это - Ваша начальная точка. На листке бумаги запишите, "объявляют идентификатор как".
  2. Взгляд направо. Если нет ничего там, или существует правая круглая скобка")", goto шаг 4.
  3. Вы теперь расположены или на массив (левая скобка) или на функцию (левая круглая скобка) дескриптор. Может быть последовательность их, закончившись или с несопоставленной правой круглой скобкой или с концом оператора объявления (точка с запятой или "=" для инициализации). Для каждого такого дескриптора, читая слева направо:

    • , если пустой массив" []", запишите "массив"
    • , если массив с размером, запишите "размер массива"
    • , если функция" ()", запишите "функцию, возвратившись"

    Остановка в несопоставленной круглой скобке или конце оператора объявления, какой бы ни на первом месте.

  4. Возврат к стартовой позиции и взгляду налево. Если нет ничего там, или существует левая круглая скобка" (", goto шаг 6.
  5. Вы теперь расположены на дескриптор указателя, "* ". Может быть последовательность их налево, закончившись или с несопоставленной левой круглой скобкой" (" или запуск оператора объявления. Чтение справа налево, для каждого дескриптора указателя пишет "указатель на". Остановитесь в несопоставленной круглой скобке или запуске оператора объявления, какой бы ни является первым.
  6. В этой точке у Вас есть или заключенное в скобки выражение или полный оператор объявления. Если Вы имеете заключенное в скобки выражение, рассматриваете его как Вашу новую начальную точку и возвращаетесь к шагу 2.
  7. , Записывают спецификатор типа. Остановиться.

, Если Вы соглашаетесь с инструментом, тогда я вторые предложение для использования программы cdecl: http://gd.tuwien.ac.at/linuxcommand.org/man_pages/cdecl1.html

8
задан Peter Mortensen 27 March 2010 в 19:41
поделиться

4 ответа

Я обнаружил, что Mersenne Twister работает быстро. Проблема может заключаться в алгоритме (Бокса-Мюллера) для преобразования равномерного распределения в распределение Гаусса. Стандартный алгоритм выглядит так:

y1 = sqrt( - 2 ln(x1) ) cos( 2 pi x2 )
y2 = sqrt( - 2 ln(x1) ) sin( 2 pi x2 )

Где x1 и x2 - однородные случайные числа, а y1 и y2 - выходы гауссовского распределения.

Квадратные корни медленные, но триггер хуже, и он нестабилен близко к 0. Страница Тайгета по этой теме дает более быстрый (в псевдокоде):

         float x1, x2, w, y1, y2;

     do {
             x1 = 2.0 * ranf() - 1.0;
             x2 = 2.0 * ranf() - 1.0;
             w = x1 * x1 + x2 * x2;
     } while ( w >= 1.0 );

     w = sqrt( (-2.0 * ln( w ) ) / w );
     y1 = x1 * w;
     y2 = x2 * w;

Если они '

4
ответ дан 5 December 2019 в 23:16
поделиться

Мой опыт показывает, что относительная производительность C # по сравнению с C ++ во многом зависит от того, что вы делаете. Отличное обсуждение здесь:

Производительность C ++ по сравнению с Java / C #

Для жестких циклов, выполняющих математику (скажем, вычисления векторной физики), C ++ в 2-3 раза быстрее, чем C #, хотя в производительности может преобладать нижележащий такие функции, как Sqrt ().

Я применил смешанный языковой подход, (повторно) реализовав самый медленный код в C ++ / OpenMP с управляемой оболочкой C ++ / CLI. Это позволяет вам платить только за то, что вы используете.

Вот краткое изложение того, как обернуть родной C / C ++ с C ++ / CLI:

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

Как только вы освоите C ++ / CLI, все будет довольно легко запустить.

0
ответ дан 5 December 2019 в 23:16
поделиться

Ограничение использования .Net в первую очередь для крупномасштабной симуляции будет стоить вам немалых затрат производительности сразу ... но при этом ...

Если вы используете реализацию Mersenne Twister на чистом C #, скорее всего, вам будет сложно настроить максимальную производительность, на которую вы способны. Если вы посмотрите на эталонную реализацию Mersenne Twister , вы увидите, что у них есть версия C, которая сильно оптимизирована для процессоров с поддержкой SSE - это очень быстро. Я не верю, что в C # (или, по крайней мере, я не знаю, как) возможно принудительно использовать инструкции SSE с таким уровнем оптимизации. Я бы предложил написать оболочку C ++ / CLI (или оболочку P / Invoke) вокруг библиотек Mersenne Twister и посмотреть, как это повлияет на вашу производительность.

0
ответ дан 5 December 2019 в 23:16
поделиться

Думали ли вы о том, чтобы указать профилировщик на свой код ? Я видел случаи, когда простые исправления получали очень значительные улучшения. Как переключение пары свойств на поля.

1
ответ дан 5 December 2019 в 23:16
поделиться
Другие вопросы по тегам:

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