pycuda学习笔记(二)

1.pycuda._driver.LogicError: cuDeviceGet failed: initialization error报错怎么办?
Traceback (most recent call last):
File “/usr/lib/python3.6/multiprocessing/process.py”, line 258, in _bootstrap
self.run()
File “/usr/lib/python3.6/multiprocessing/process.py”, line 93, in run
self._target(*self._args, **self._kwargs)
File “a.py”, line 15, in dott
ctx = cuda.Device(0).make_context()
pycuda._driver.LogicError: cuDeviceGet failed: initialization error

答:cuDeviceGet失败:初始化错误。显卡初始化失败。
把显卡初始化的代码写到函数内部即可。或者用这句代码试试

mp.set_start_method('spawn')

这行代码执行完,意味着原来的进程和子进程已经隔离开.

2.上面提到隔离开,那父进程和子进程怎么通信?
答:三种方法,1.消息队列。2.pipe管道。3.数据共享

#进程queue传递
from multiprocessing import Process,Queue

def f(qq):
    qq.put([42, None, 'hello'])

if __name__ == '__main__':
    q = Queue() #父进程queue
    p = Process(target=f,args=(q,)) #子进程 父进程的queue传给子进程 


#实现数据传递
    p.start() #启动子进程
    print(q.get())  # prints "[42, None, 'hello']" 父进程q可以get到子进程p 实现父进程子进程数据共享
    p.join()

#线程queue不能传给进程

 
#管道传递
 from multiprocessing import Process, Pipe

 def f(conn):
     conn.send([42, None, 'hello from child'])
     conn.send([43,None,'hello from child2'])
     print("child recv:",conn.recv())
     conn.close()

 if __name__ == '__main__':
     parent_conn, child_conn = Pipe() #生成管道实例,取出两端
     p = Process(target=f, args=(child_conn,))
     p.start()
     print(parent_conn.recv())# prints "[42, None, 'hello']"
     print(parent_conn.recv())
     parent_conn.send("hello send by parent")
     p.join()




manager数据共享
 from multiprocessing import Process, Manager
 import os

 def f(d, l):#每个子进程执行的函数
     d[os.getpid()]=os.getpid()
     l.append(os.getpid())
     print(l)


 if __name__ == '__main__':
     with Manager() as manager:#
         d = manager.dict() #父进程生成一个字典 多个进程之间可共享的字典

         l = manager.list(range(5)) #父进程生成一个列表 多个进程之间可以共享的列表 默认有5个数据
         p_list = [] #用于多个进程join
         for i in range(10):
             p = Process(target=f, args=(d, l))
             p.start() #开启10个子进程
             p_list.append(p)
         for res in p_list: # 等待每个子进程结果
             res.join()

         print(d)
         print(l)

代码如下

# import pycuda.autoinit
import pycuda.driver as cuda
import numpy
import multiprocessing as mp

from pycuda.compiler import SourceModule
# export PATH=/usr/local/cuda/bin:$PATH


  


def dott(array_a, array_b):
    cuda.init()  
    ctx  = cuda.Device(0).make_context()
    mod = SourceModule("""
    __global__ void dot(float *dest, float *a, float *b)
    {
    const int i = threadIdx.x;
    dest[i] = a[i] * b[i];
    }
    """)
    dot = mod.get_function("dot")

    dest = numpy.zeros_like(array_a)
    dot(cuda.Out(dest), cuda.In(array_a), cuda.In(array_b),block=(len(array_a),1,1), grid=(1,1))
    print(dest)
    print("运行成功!")
    ctx.pop()
    return dest



if __name__ == "__main__":
    a = numpy.random.normal(size=40).astype(numpy.float32)
    b = numpy.random.normal(size=40).astype(numpy.float32)

    mp.set_start_method('spawn')
    ps = []
    for i in range(2):
        p = mp.Process(target=dott, args=((a,b)))
        ps.append(p)
        p.start()

    for p in ps:
        p.join()
    





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
卡尔曼滤波器学习笔记) 在上一篇笔记中,我们介绍了卡尔曼滤波器的基本原理和数学模型。现在,让我们继续深入学习卡尔曼滤波器的实际应用。 1. 状态方程(State Equation): 卡尔曼滤波器的核心是状态方程,描述系统的状态如何随时间变化。通常表示为x(k+1) = A * x(k) + B * u(k) + w(k),其中x(k)表示系统在时刻k的状态,A是状态转移矩阵,u(k)表示输入,B是输入矩阵,w(k)表示过程噪声。 2. 观测方程(Measurement Equation): 观测方程描述了系统状态与观测值之间的关系。通常表示为z(k) = H * x(k) + v(k),其中z(k)表示观测值,H是观测矩阵,v(k)表示观测噪声。 3. 卡尔曼增益(Kalman Gain): 卡尔曼增益决定了如何将先验估计与观测值相结合,得到更准确的后验估计。卡尔曼增益的计算公式为K(k) = P(k|k-1) * H^T * (H * P(k|k-1) * H^T + R)^-1,其中P(k|k-1)表示先验误差协方差矩阵,R表示观测噪声的协方差矩阵。 4. 预测步骤(Prediction Step): 预测步骤用于根据系统的模型预测下一时刻的状态和误差协方差矩阵。预测步骤的计算公式为x(k+1|k) = A * x(k|k) + B * u(k),P(k+1|k) = A * P(k|k) * A^T + Q,其中x(k|k)表示先验估计,P(k|k)表示先验误差协方差矩阵,Q表示过程噪声的协方差矩阵。 5. 更新步骤(Update Step): 更新步骤用于根据观测值修正先验估计,得到后验估计和后验误差协方差矩阵。更新步骤的计算公式为x(k+1|k+1) = x(k+1|k) + K(k+1) * (z(k+1) - H * x(k+1|k)),P(k+1|k+1) = (I - K(k+1) * H) * P(k+1|k),其中x(k+1|k+1)表示后验估计,P(k+1|k+1)表示后验误差协方差矩阵,K(k+1)表示卡尔曼增益。 以上就是卡尔曼滤波器的基本概念和计算步骤。在实际应用中,我们需要根据具体问题来确定状态方程、观测方程和相关参数。卡尔曼滤波器的优势在于可以有效地处理噪声和不确定性,广泛应用于目标跟踪、导航、机器人等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值