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

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

13.12.2017, 23:25. Просмотров 379. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

4
Tassadar_
11 / 10 / 6
Регистрация: 31.01.2016
Сообщений: 62
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_
11 / 10 / 6
Регистрация: 31.01.2016
Сообщений: 62
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

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

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

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


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

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

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