首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在pyCUDA内核中生成随机数?

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

Stack Overflow用户
提问于 2017-09-11 22:43:38
回答 2查看 2K关注 0票数 5

我正在使用pyCUDA进行CUDA编程。我需要在内核函数中使用随机数。在它内部不工作(pyCUDA)。由于GPU中有大量的工作要做,在CPU内部产生随机数,然后再将它们传输到GPU上是行不通的,反而消除了使用GPU的动机。

补充质询:

  1. 是否有一种使用一个块和一个线程在GPU上分配内存的方法。
  2. 我正在使用多个内核。我需要使用多个SourceModule块吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-12 08:18:02

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

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

代码语言:javascript
运行
AI代码解释
复制
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接口对这些线程进行操作。

票数 6
EN

Stack Overflow用户

发布于 2019-03-14 10:55:18

我在接受的答案中有一个问题。我们有一个名叫mangling,有点恶心(这些_Z10initkerneli_Z14randfillkernelPfi)。为了避免这种情况,我们可以手动将代码包装在extern "C" {...}子句中。

代码语言:javascript
运行
AI代码解释
复制
code = """
    #include <curand_kernel.h>

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

    __global__ void initkernel(int seed)
    { .... }

    __global__ void randfillkernel(float *values, int N)
    { .... }
    }
"""

然后,代码仍然用no_extern_c=True编译。

代码语言:javascript
运行
AI代码解释
复制
mod = SourceModule(code % { "NGENERATORS" : N }, no_extern_c=True)

这应该适用于

代码语言:javascript
运行
AI代码解释
复制
init_func = mod.get_function("initkernel")
fill_func = mod.get_function("randfillkernel")

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46169633

复制
相关文章
如何在Python和numpy中生成随机数
随机性的使用是机器学习算法配置和评估的重要部分。从神经网络中的权重的随机初始化,到将数据分成随机的训练和测试集,再到随机梯度下降中的训练数据集的随机混洗(random shuffling),生成随机数和利用随机性是必需掌握的技能。
AiTechYun
2018/07/27
19.3K0
如何在Python和numpy中生成随机数
Python中随机数的生成[通俗易懂]
在Python中可以用于随机数生成的有两种主要途径,一是random模块,另一个是numpy库中random函数。
全栈程序员站长
2022/11/10
2.1K0
生成随机数
有时候我们需要在程序中生成随机数。 但是Objective-C并没有提供相关函数,好在C提供了rand(), srand(), random(), srandom(), arc4random()几个函数
EltonZheng
2021/01/26
2.8K0
生成随机数
Python能够很简单地实现随机数的生成 1.生成指数分布的随机数 2.生成随机分布的随机数
福贵
2019/03/06
3.9K0
生成随机数
随机数生成 python_python生成多个随机数
seed() 方法改变随机数生成器的种子,可以在调用其他随机模块函数之前调用此函数。。
全栈程序员站长
2022/11/09
2.6K0
Python中的random模块用于生成随机数
Python中的random模块用于生成随机数。下面介绍一下random模块中最常用的几个函数。 random.random random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 random.uniform   random.uniform的函数原型为:random.uniform(a, b),用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a > b,则生成的随机数n: b <= n <= a。如果 a <b, 则 a <= n <
学到老
2018/03/16
1.4K0
python如何生成随机数_Python生成50个随机数
可以生成 均匀分布, 高斯分布,(包括正态分布) 指数分布,(与泊松分布有区别:泊松分布表示一段时间发生多少次,而指数分布表示两次发生的时间间隔) 贝塔分布, 韦布尔分布的随机数
全栈程序员站长
2022/11/10
3.2K0
如何生成随机数
扔色子就是一个随机过程,得到的结果就是随机数。再比如对生产线的同一种产品称重,单个产品的重量也是不一样的,得到的结果也是随机数。
fem178
2019/08/19
3.6K0
如何生成随机数
php随机数生成漏洞函数,php随机数生成函数[通俗易懂]
$chars=’ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789′;
全栈程序员站长
2022/11/17
3.5K0
如何在cuda内核函数中产生随机数(host端调用,device端产生)
最近,需要在kernel函数中调用浮点型的随机数。于是上网搜了下相关资料,一种方式是自己手动写一个随机数的__device__函数,然后在调用的时候调用这个函数。另一种,原来cuda在toolkit中给出了实现方式。 首先要用到三个函数: curandCreateGenerator(&gen,CURAND_RNG_PSEUDO_DEFAULT); 指定触发器为gen,随机方式为CURAND_RNG_PSEUDO_DEFAULT curandSetPseudoRandomGeneratorSeed(gen,
用户1154259
2018/01/17
1.7K0
Random生成随机数
/* * Random:用于产生随机数 * * 使用步骤: * A:导包 * import java.util.Random; * B:创建对象 * Random r = new Random(); * C:获取随机数 * int number = r.nextInt(10); * 获取数据的范围:[0,10) 包括0,不包括10 */ package com.pku.wuyu.io; import java.util.Random; publ
葆宁
2019/04/18
2.7K0
Python生成随机数矩阵_Python生成50个随机数
使用 random 模块 random.random() 用于随机生成一个0到1的浮点数 random.randint(start,stop) 随机生成[start,stop]区间内的整数 代码示例:
全栈程序员站长
2022/11/09
2.1K0
go生成随机数
随机字符串 func GeRnd() string { b := make([]byte, 8) rand.Read(b) return fmt.Sprintf("%x", b) } 随机数 // RndInt 生成 [start, end]的随机数 func RndInt(start, end int) int { du := end - start + 1 rand.Seed(time.Now().UnixNano()) return start + ra
超级大猪
2019/11/22
1.8K0
Java生成随机数
1、使用Math方法 int num = (int)(Math.random()*100); 2、使用Random方法生成随机数 Random random = new Random(); //1024以内的随机数 random.nextInt(1024); 3、使用SecureRandom生成随机数 SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); secureRandom.setSeed(10000L); //1024以内
红目香薰
2022/11/29
2.3K0
Python中的random模块用于生成随机数
Python中的random模块用于生成随机数。下面介绍一下random模块中最常用的几个函数。
学到老
2019/02/14
1.2K0
Python 随机数生成
以上实例我们使用了 random 模块的 randint() 函数来生成随机数,你每次执行后都返回不同的数字(0 到 9),该函数的语法为:
狼啸风云
2020/08/10
1.9K0
shell 生成随机数
/dev/random 存储着系统当前运行环境的实时数据,是阻塞的随机数发生器,读取有时需要等待。
阳光岛主
2019/02/18
3.4K0
java 代码生成随机数:时间+随机数,生成唯一的主键
package utils; import java.util.Random; import java.util.UUID; public class KeyUtil { 生成唯一的主键 格式: 时间+随机数 public static synchronized String getUniqueKey(String str) { Random random = new Random(); Integer number = random.nextInt(9000
一写代码就开心
2022/05/09
3.1K0
点击加载更多

相似问题

在pyCuda内核中生成单随机数

279

基于pyCUDA的随机数生成

10

函数如rand(),在CUDA _global_内核中生成随机数?

12

PyCUDA内核计时错误

10

Pycuda:多次调用内核的最佳方法

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文