gpt4 book ai didi

cuda - 如何在 pyCUDA 内核中生成随机数?

转载 作者:行者123 更新时间:2023-12-03 22:22:11 29 4
gpt4 key购买 nike

我正在使用 pyCUDA 进行 CUDA 编程。我需要在内核函数中使用随机数。 CURAND 库在其中不起作用(pyCUDA)。由于GPU有很多工作要做,在CPU内部生成随机数然后将它们传输到GPU是行不通的,反而消解了使用GPU的动机。

补充问题:

  • 有没有办法使用 1 个 block 和 1 个线程在 GPU 上分配内存。
  • 我正在使用多个内核。我需要使用多个 SourceModule block 吗?
  • 最佳答案

    尽管您在问题中断言,PyCUDA 对 CUrand 的支持非常全面。 GPUArray 模块具有使用主机端 API 填充设备内存的直接接口(interface)(请注意,在这种情况下,随机生成器在 GPU 上运行)。

    也完全可以在 PyCUDA 内核代码中使用来自 CUrand 的设备端 API。在这个用例中,最棘手的部分是为线程生成器状态分配内存。有三种选择——在代码中静态、动态使用主机内存端分配和动态使用设备端内存分配。以下(非常轻微的测试)示例说明了后者,正如您在问题中询问的那样:

    import numpy as np
    import pycuda.autoinit
    from pycuda.compiler import SourceModule
    from pycuda import gpuarray

    code = """
    #include <curand_kernel.h>

    const int nstates = %(NGENERATORS)s;
    __device__ curandState_t* states[nstates];

    __global__ void initkernel(int seed)
    {
    int tidx = threadIdx.x + blockIdx.x * blockDim.x;

    if (tidx < nstates) {
    curandState_t* s = new curandState_t;
    if (s != 0) {
    curand_init(seed, tidx, 0, s);
    }

    states[tidx] = s;
    }
    }

    __global__ void randfillkernel(float *values, int N)
    {
    int tidx = threadIdx.x + blockIdx.x * blockDim.x;

    if (tidx < nstates) {
    curandState_t s = *states[tidx];
    for(int i=tidx; i < N; i += blockDim.x * gridDim.x) {
    values[i] = curand_uniform(&s);
    }
    *states[tidx] = s;
    }
    }
    """

    N = 1024
    mod = SourceModule(code % { "NGENERATORS" : N }, no_extern_c=True, arch="sm_52")
    init_func = mod.get_function("_Z10initkerneli")
    fill_func = mod.get_function("_Z14randfillkernelPfi")

    seed = np.int32(123456789)
    nvalues = 10 * N
    init_func(seed, block=(N,1,1), grid=(1,1,1))
    gdata = gpuarray.zeros(nvalues, dtype=np.float32)
    fill_func(gdata, np.int32(nvalues), block=(N,1,1), grid=(1,1,1))

    这里有一个初始化内核,它需要运行一次来​​为生成器状态分配内存并使用种子初始化它们,然后是一个使用这些状态的内核。如果要运行大量线程,则需要注意 malloc 堆大小限制,但可以通过 PyCUDA 驱动程序 API 接口(interface)进行操作。

    关于cuda - 如何在 pyCUDA 内核中生成随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46169633/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com