【问题标题】:How to create simple random array using Numba xoroshiro128p如何使用 Numba xoroshiro128p 创建简单的随机数组
【发布时间】:2018-06-28 10:53:21
【问题描述】:

我需要在 JIT 函数中使用 Numba xoroshiro128p 创建随机数组的简单示例。例如按大小(2,4)的最终数组外壳。 numba doc的链接here

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 上执行此操作的速度相同。

【问题讨论】:

  • 是的,但我没有得到任何答案:(。我需要看看工作简单的例子。
  • 您链接到的文档中有一个示例。我们又要绕圈子了吗?并且在这里不允许因为您没有得到答案而重新提出相同的问题。
  • 这个例子对我来说太难了。我只需要随机数组,不知道如何从这个例子中提取这个。
  • 所以自己简化吧。它是 8 行代码。去掉你不理解的部分,用你能理解的部分替换它们,看看它们做了什么。如果它不起作用,那么请返回一个关于它为什么不起作用的问题

标签: random cuda numba


【解决方案1】:

documentation 中的 example 可以进行简单的修改以执行您想要的操作

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))

【讨论】:

  • 这看起来不错。嗯..不知道为什么我这么挣扎。
  • 有没有办法在 cuda 上比使用 numpy 更快地创建数组?
  • numpy 不创建 cuda 数组
  • 我知道,但是在 python 中是否有比 numpy 更快的解决方案?
  • 比使用 numpy 创建 numpy 数组更快的方法?
【解决方案2】:

灵感来自 talonmies 答案:

@cuda.jit

def random(threads_per_block, blocks):

    def rand_array(rng_states, out): # inside "def random"
        thread_id = cuda.grid(1)
        x = xoroshiro128p_uniform_float32(rng_states, thread_id)
        out[thread_id] = x

    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)
    return out.reshape(blocks,threads_per_block)

# Example of usage: 
matrix100x100 = random(100, 100)

在 Nvidia GTX-650 中测量性能

库达:

%timeit random(100, 100)

每个循环 613 毫秒 ± 2.6 毫秒(平均值 ± 标准偏差,7 次运行,每个循环 1 个)

麻木:

%timeit np.random.rand(100, 100)

每个循环 19.1 ms ± 353 µs(平均值 ± 标准偏差,7 次运行,每次 100 个循环)

【讨论】:

    猜你喜欢
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    相关资源
    最近更新 更多