Монте-Карло на ГПУ - PullRequest
       40

Монте-Карло на ГПУ

5 голосов
/ 05 апреля 2011

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

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

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

Ответы [ 3 ]

5 голосов
/ 06 апреля 2011

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

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

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

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

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

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

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

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

3 голосов
/ 17 июня 2011

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

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

__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]);
}
0 голосов
/ 07 апреля 2011

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

...