Форум программистов, компьютерный форум, киберфорум
Наши страницы
CUDA
Войти
Регистрация
Восстановить пароль
 
ghostvlg
0 / 0 / 0
Регистрация: 13.12.2017
Сообщений: 5
#1

Генератор случайных чисел, curand - CUDA

13.12.2017, 23:25. Просмотров 341. Ответов 4
Метки нет (Все метки)

Доброго времени суток, очень сильно нужна помощь. Мне нужно сгенерировать 10^11 случайных чисел с равномерным и нормальным распределением чисел на GPU. Поискав в интернете нашел библиотеку curand. Но не понимаю как сгенерировать именно такое большое количество.

Вот код, который нашел в документации Nvidia:
это для равномерного распределения.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <cuda.h>
#include <curand_kernel.h>
#include <stdio.h>
#include <time.h>
 
#define N 100000000000
 
__global__ void setup_kernel(curandState * state, unsigned long seed)
{
    int id = threadIdx.x + blockIdx.x * blockDim.x;
        curand_init(seed, id, 0, &state[id]);
        
    
}
 
__global__ void generate(curandState* globalState, float* randomArray)
{
    int ind = threadIdx.x + blockIdx.x * blockDim.x;
        curandState localState = globalState[ind];
        float RANDOM = curand_uniform(&localState);
        randomArray[ind] = RANDOM;
        globalState[ind] = localState;
        
 
}
 
int main(int argc, char** argv)
{
    
    curandState* devStates;
    float* randomValues = new float[N];
    float* devRandomValues;
    cudaEvent_t start, end;
    cudaEventCreate(&start);
    cudaEventCreate(&end);
    float timeGPU;
 
    cudaMalloc(&devStates, N * sizeof(curandState));
    cudaMalloc(&devRandomValues, N * sizeof(*randomValues));// setup seeds
 
    cudaEventRecord(start, 0);
    setup_kernel <<<512, 512 >>>(devStates, time(NULL));
 
    generate <<<512, 512 >>>(devStates, devRandomValues);
    
    cudaEventRecord(end, 0);
 
    cudaMemcpy(randomValues, devRandomValues, N * sizeof(*randomValues), cudaMemcpyDeviceToHost);
    
    cudaEventSynchronize(end);
    cudaEventElapsedTime(&timeGPU, start, end);
    printf("Time: %f\n", timeGPU*0.001);
 
    
    /*for (int i = 0; i<N; i++)
    {
        printf("%f , ", randomValues[i]);
        
    }*/
 
    cudaFree(devRandomValues);
    cudaFree(devStates);
    delete randomValues;
    getchar();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2017, 23:25
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Генератор случайных чисел, curand (CUDA):

CUDA генератор случайных чисел
Доброго времени суток! Подскажите,пожалуйста,как решить проблему.Суть...

Создать генератор случайных чисел с вычеркиванием сгенерированных чисел
Помогите пож. решить задачку: 1 Есть диапазон чисел от 1 до «i» 2...

Генератор случайных чисел на основе ряда натуральных чисел
Подскажите плиз, можно ли из ряда натуральных чисел образовать псевдослучайные...

Генератор случайных чисел
Здравствуйте,я только только начал изучать делфи и сейчас делаю программу с...

Генератор случайных чисел
Задание 3 кнопки 1 листбокс 1 кнопка-генерирует случайные числа 2 -...

Генератор случайных чисел
Реализовать генератор случайных числе в диапазоне от нуля до единицы. После...

4
Tassadar_
7 / 7 / 5
Регистрация: 31.01.2016
Сообщений: 50
14.12.2017, 16:58 #2
Насколько я понимаю,каждый thread создаёт по одному случайному числу.То есть вам нужно х раз запустить функцию generate по у thread'ов за раз,тогда вы получите х*у случайных чисел.Но,думается мне,что есть вариант использовать двумерный массив N x M,где N - число thread'ов,а М - 10^11/N,и подправить код так,чтобы каждый thread создавал не одно случайное число,а набор из М случайных чисел.Тогда за один проход функции generate вы получите все 10^11 случайных чисел.
0
ghostvlg
0 / 0 / 0
Регистрация: 13.12.2017
Сообщений: 5
14.12.2017, 18:44  [ТС] #3
Хороший вариант, но как теперь его реализовать? В одном блоке всего 1024 нити, блоков ооочень много (около 2 млрд. по иксу, еще по y 65тыс и по z столько же), я не знаю как мне разбить задачу, так, чтобы числа сгенерировались как можно быстрее. На cpu данный процесс занимает около 2 часов. Мне нужно быстрее сделать на GPU.
0
Tassadar_
7 / 7 / 5
Регистрация: 31.01.2016
Сообщений: 50
14.12.2017, 20:15 #4
Из моего небольшого опыта работы с CUDA,могу сказать,что у меня не получалось за раз запускать больше,чем 1024*1024 нити в одной функции.Тогда можно организовать как цикл,и оставить код cuda-функции как есть:
C++
1
2
3
4
5
6
7
8
//...
for(int ineration_number = 0; i < int(N/1024/1024); ineration_number++)
{
    generate <<<1024, 1024 >>>(devStates, devRandomValues);
    cudaMemcpy(randomValues, devRandomValues, N * sizeof(*randomValues), cudaMemcpyDeviceToHost);
    //*запись полученных данных в рабочий массив*
}
//...
Либо же применить двумерные массивы и отдавать каждой нити свой вектор-столбец на работу,тут уже подумать надо.
Второй вариант более эффективный должен быть,как мне кажется.
0
ghostvlg
0 / 0 / 0
Регистрация: 13.12.2017
Сообщений: 5
14.12.2017, 20:25  [ТС] #5
Первый вариант наверняка сработает, НО из-за большого количества передачи данных туда-сюда увеличится время всего процесса.
Над вторым вариантом я тоже думал, но так и не смог сделать рабочий вариант.
Нашел вариант как проходить по строке и столбцам:
Код
int idx = threadIdx.x + blockIdx.x * blockDim.x;
int idy = threadIdx.y + blockIdx.y * blockDim.y;
А дальше не знаю, как используя ниже код, сгенерирвоать числа и записать в массив.
Код
float RANDOM = curand_uniform(&localState);
randomArray[ind] = RANDOM;
0
14.12.2017, 20:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2017, 20:25
Привет! Вот еще темы с решениями:

Генератор случайных чисел
Доброго времени суток. Мне нужно СОЗДАТЬ генератор случайных чисел в матлабе....

Генератор случайных чисел
Добрый вечер! Собственно-то тако задание: необходимо правильно задать параметры...

Генератор случайных чисел
1) дан массив целых чисел. Найти сумму элементов массива, принадлежащих...

Генератор случайных чисел
Здорова господа! Нужно написать свой собственный генератор случайных чисел,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru