Как создать простой случайный массив с помощью Numba xoroshiro128p - PullRequest
0 голосов
/ 28 июня 2018

Мне нужно получить простой пример для создания случайного массива с использованием Numba xoroshiro128p в функции JIT. Например, окончательная оболочка массива размером (2,4). Ссылка для numba doc здесь

Pseudo code:

minimum = -2
maximum = 2

out_array = random(minimum, maximum, shape(2,4))

Output:
[[ 1.87569628  2.85881711  3.6009965   1.49224129]
 [-3.27321953  1.59090995 -4.66912864 -3.43071647]]

Возможно ли создать массив с помощью cuda быстрее, чем с помощью numpy? Например:

minimum_bound = -1
maximum_bound = 1
vectors_number = 12000000
variable_number = 6

@jit
def random_matrix(vectors_number, variable_number):
    population_generator = np.random.uniform(minimum_bound, 
    maximum_bound, (vectors_number, variable_number))
    return population_generator

population_array = random_matrix(vectors_number, variable_number)

С созданием 1200000 векторов я получаю такую ​​же скорость, как и при выполнении cuda. ​​

1 Ответ

0 голосов
/ 28 июня 2018

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

from numba import cuda
from numba.cuda.random import create_xoroshiro128p_states, xoroshiro128p_uniform_float32
import numpy as np

@cuda.jit
def rand_array(rng_states, out):
    thread_id = cuda.grid(1)
    x = xoroshiro128p_uniform_float32(rng_states, thread_id)
    out[thread_id] = x


threads_per_block = 4
blocks = 2 
rng_states = create_xoroshiro128p_states(threads_per_block * blocks, seed=1)
out = np.zeros(threads_per_block * blocks, dtype=np.float32)

rand_array[blocks, threads_per_block](rng_states, out)
print(out.reshape(blocks,threads_per_block))
...