Монте-Карло на графическом процессоре

Сегодня я разговаривал с моим другом, который сказал мне, что он пытается сделать несколько симуляций методом Монте-Карло с использованием графического процессора. Что было интересно, он мне сказал, что хотел рисовать числа случайным образом на разных процессорах и предполагал, что они некоррелированы. Но это не так.

Вопрос в том, существует ли способ отрисовки независимых наборов чисел на нескольких графических процессорах? Он думал, что использование разного начального числа для каждого из них решит проблему, но это не так.

Если потребуются какие-либо разъяснения, пожалуйста, дайте мне знать, я попрошу его предоставить более подробную информацию.


person MPękalski    schedule 05.04.2011    source источник
comment
Как вы определили, что они не коррелированы?   -  person Ralph Winters    schedule 05.04.2011
comment
Это был не я, но, насколько я понял, он вычислял обычную корреляцию между случайными числами, сгенерированными на разных ядрах GPU. Я не очень разбираюсь в том, как генерируются случайные числа, поэтому другой вопрос: от чего зависят случайные числа? Типа цикла CPU/GPU или что?   -  person MPękalski    schedule 05.04.2011
comment
Он мог сгенерировать случайные числа из оборудования или какого-то программного обеспечения. Вероятно, генератор псевдослучайных чисел, где он поставляет начальное число. Он мог бы заявить о корреляции, но ему нужно продемонстрировать, что корреляция статистически отлична от 0 при очень большом размере выборки.   -  person Ralph Winters    schedule 05.04.2011
comment
Но если например случайность числа зависит от процессора. Тогда установка разных начальных чисел на каждом графическом процессоре не поможет, так как это займет только другую часть той же последовательности - насколько я понимаю идею установки начального числа.   -  person MPękalski    schedule 05.04.2011
comment
Вероятно, он устанавливает разные начальные числа для каждого, чтобы убедиться, что последовательности не идентичны.   -  person Ralph Winters    schedule 06.04.2011


Ответы (3)


Для генерации полностью независимых случайных чисел необходимо использовать параллельный генератор случайных чисел. По сути, вы выбираете одно начальное число, и оно генерирует M независимых потоков случайных чисел. Таким образом, на каждом из графических процессоров M вы можете генерировать случайные числа из независимых потоков.

При работе с несколькими графическими процессорами вам нужно знать, что вы хотите:

  • независимые потоки внутри графических процессоров (если RN генерируются каждым графическим процессором)
  • независимые потоки между графическими процессорами.

Оказывается, генерировать случайные числа на каждом ядре GPU сложно (см. этот вопрос I спросил некоторое время назад). Когда я играл с графическими процессорами и RN, вы получаете ускорение генерации случайных чисел на графическом процессоре только в том случае, если вы генерируете большие числа одновременно.

Вместо этого я бы генерировал случайные числа на ЦП, поскольку:

  • Проще, а иногда и быстрее генерировать их на ЦП и передавать через него.
  • Вы можете использовать проверенные параллельные генераторы случайных чисел.
  • Типы готовых генераторов случайных чисел, доступных для графических процессоров, очень ограничены.
  • Текущие библиотеки случайных чисел GPU генерируют RN только из небольшого числа дистрибутивов.

Чтобы ответить на ваш вопрос в комментариях: От чего зависят случайные числа?

Очень простым генератором случайных чисел является линейный конгруэнтный генератор. Хотя этот генератор был превзойден более новыми методами, он должен дать вам представление о том, как они работают. По сути, i-е случайное число зависит от (i-1) случайного числа. Как вы заметили, если вы запускаете два потока достаточно долго, они будут перекрываться. Большая проблема в том, что вы не знаете, когда они пересекутся.

person csgillespie    schedule 05.04.2011

Для генерации юниформ-переменных iid вам просто нужно инициализировать ваши генераторы с разными начальными значениями. С Cuda вы можете использовать библиотеку NVIDIA Curand, которая реализует генератор Mersenne Twister.

Например, следующий код, выполняемый 100 ядрами параллельно, отобразит 10 выборок (R^10)-uniform.

__global__ void setup_kernel(curandState *state,int pseed)
{
    int id =  blockIdx.x * blockDim.x + threadIdx.x;
    int seed = id%10+pseed;

    /* 10 differents seed for uncorrelated rv, 
    a different sequence number,    no offset */
    curand_init(seed, id, 0, &state[id]);
}
person Beer4All    schedule 17.06.2011
comment
Под 100 ядрами в параллельном режиме вы подразумеваете 100 параллельных потоков? - person gpuguy; 20.02.2013

Если вы возьмете любой «хороший» генератор (например, Mersenne Twister и т. д.), две последовательности с разными случайными начальными числами будут некоррелированы, будь то GPU или CPU. Следовательно, я не уверен, что вы имеете в виду, говоря, что недостаточно использовать разные семена на разных графических процессорах. Не могли бы вы уточнить?

person ev-br    schedule 07.04.2011