2016-02-18 4 views
0

В настоящее время я работаю с ManagedCuda и хочу генерировать случайные числа на устройстве. Однако я не могу найти простой пример, как это сделать (просмотр объектов в пространстве имен ManagedCuda.CudaRand и сравнение с эквивалентом C++ больше не приводит меня).Использование CuRand в ManagedCuda

Актуальный вопрос: Как я могу генерировать случайные числа в ядре при использовании managedCuda вместо обычного C++ API?

+0

У вас возникли конкретные вопросы? – talonmies

+0

@talonmies yes: Как работает curand в managedCuda? Как мне настроить его для генерации случайных чисел в ядре? – MarijnS95

ответ

2

Как вам кажется, вы только хотите использовать API-интерфейс устройства CURAND, тогда вы будете полностью независимы от managedCuda: все, что вам нужно сделать в managedCuda, - это выделить достаточно большой кусок памяти для сохранения текущих curandStates , Вам даже не нужна ссылка на CudaRand.dll для managedCuda.

Затем вы создаете ядро ​​init, которое вызывает для каждого потока curand_init(), а затем в вашем реальном ядре вы используете curand_normal() или любую другую функцию rand. Пошаговый пример приведен в руководстве curand в главе 3.6.

+0

Спасибо, я попробую это позже. Однако, угадывая из примера, выделенное количество выделенной памяти определяется размером структуры curandState. Вероятно, нет возможности понять это через managedCuda? (за исключением получения размера на устройстве, хранения в памяти устройства и запроса от него на C#) – MarijnS95

+0

По-видимому, это 48 байт (в CUDA 7.5), вычисленный с помощью вышеупомянутого метода sizeof. – MarijnS95

+0

Спасибо! Это было так же просто, как выделить достаточно памяти (kernelIterations * 48 bytes), установив глобальный ('__device__ curandState * randomState;'), чтобы указать на эти данные, вызвав ядро ​​установки для его настройки ('curand_init (1234, i, 0, & RandomState [i]); '), а затем генерируют случайные поплавки (используя' float f = curand_uniform (& randomState [i]); '). – MarijnS95