问题标签 [pycuda]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cuda - 多个 GPU 上的 CUDA 上下文、流和事件
TL;DR 版本: “使用 Python/PyCUDA 循环内核调用多个 GPU 以使 CPU 和 GPU 工作可以并行发生的最佳方式是什么?” 一边说“我不可能是第一个问这个的人;有什么我应该读的吗?”
完整版本:
我想知道在具有多个 GPU 的系统上使用 CUDA 的应用程序中设计上下文等处理的最佳方法。我一直在尝试查找有关何时适合上下文重用与娱乐的指南的文献,但到目前为止还没有找到任何概述最佳实践、经验法则等的内容。
我们需要做的总体概述是:
- 请求进入一个中央流程。
- 该进程分叉处理单个请求。
- 数据从数据库加载(相对昂贵)。
以下内容根据请求重复任意次数(数十次):
- 一些快速内核调用来计算后续内核所需的数据。
- 一个缓慢的内核调用(10 秒)。
最后:
- 内核调用的结果在 CPU 上收集和处理,然后存储。
目前,每个内核调用都会创建然后销毁一个上下文,这似乎很浪费。每个上下文和内核负载的设置大约需要 0.1 秒,虽然这不是很大,但它阻止了我们将其他更快的任务转移到 GPU。
我正在尝试找出管理上下文等的最佳方法,以便我们可以有效地使用机器。我认为在单gpu的情况下,它相对简单:
- 在开始任何 GPU 工作之前创建一个上下文。
- 启动第一组数据的内核。
- 记录系列中最后一次内核调用之后的事件。
- 在 CPU 上准备第二组数据,而第一组数据在 GPU 上进行计算。
- 启动第二组,重复。
- 确保每个事件在收集结果并存储它们之前得到同步。
假设正确使用重叠的内存副本,这似乎应该可以解决问题。
但是,我不确定当想要循环处理数十个项目中的每一个以在多个 GPU 上处理时我应该做什么。
宿主程序是 Python 2.7,使用 PyCUDA 访问 GPU。目前它不是多线程的,虽然我宁愿保持这种方式(“现在你有两个问题”等),如果答案意味着线程,它意味着线程。同样,当需要阻塞数据时,能够在主线程中调用 event.synchronize() 会很好,但是对于我们的需要,有效地使用硬件更为重要。由于我们可能会同时处理多个请求,因此让其他进程在该进程不使用 GPU 时使用它很重要。
我认为我们没有任何明确的理由使用独占计算模式(即,我们不会用一个工作项来填充卡的内存),所以我不认为涉及长期上下文的解决方案不在桌子上。
请注意,以指向涵盖我的问题的其他内容的链接形式的答案是完全可以接受的(甚至是鼓励的),只要它们对原因有足够的详细信息,而不仅仅是 API。谢谢阅读!
python - PyCUDA 安装时出错
我尝试使用以下说明安装 PyCUDA:http ://wiki.tiker.net/PyCuda/Installation/Linux ,在第 3 点我正在编译:
从控制台获得以下输出:
我应该怎么办?
编辑:我的操作系统是:Arch Linux 3.3.2.1。显卡:英伟达 GF 9600M GS
python - 皮库达;nvcc 致命:找不到 Visual Studio 配置文件“(空)”
在安装 Visual C++ Express 2010 和各种 Nvidia 驱动程序、SDK 等之后,我正在尝试运行pycuda 入门教程。我得到了
没有错误。但是 IPython 中的这个调用会产生
在此之后,我安装了 MS Windows SDK 而不影响此错误,尽管我现在似乎能够在 Visual C++ Express 2010 中选择 x64 程序。那么,我需要修复什么?(我使用了预编译的 pycuda 文件。)
ubuntu - ubuntu 上的 pycuda 安装错误:/usr/bin/ld: 找不到 -lcuda
我是初学者并在 ubuntu 11.10 上安装 pycuda2011.2.2,但无法完成。库达是 4.0。
我已经安装了库:
$ sudo apt-get install build-essential python-dev python-setuptools libboost-python-dev libboost-thread-dev -y
像这样调用configure.py:
$ ./configure.py --cuda-root=/usr/local/cuda --cudadrv-lib-dir=/usr/lib --boost-inc-dir=/usr/include --boost-lib-dir= /usr/lib --boost-python-libname=boost_python-mt-py27 --boost-thread-libname=boost_thread-mt
但是,当我这样做时:
我收到此错误:
/usr/bin/ld: 找不到 -lcuda
/usr/bin/ld:在搜索 -lcurand 时跳过不兼容的 /usr/local/cuda/lib/libcurand.so
为什么这个错误?
谢谢。
python - 将 Twisted 中的代码推迟到特定线程
我正在用 Twisted 和 pyCUDA 编写服务器。CUDA 工作方式的一个限制是我必须在初始化它的同一线程中访问 CUDA 上下文。但是,Twisted 的线程池实现不允许我请求特定线程。
例如,如果我有多个客户端连接到服务器,它们将请求使用 CUDA 完成一些计算。将使用同一个 CUDA 对象请求多个操作(初始化很昂贵)。我想使用 deferToThread 函数,但这不允许我推迟到特定线程,只是“一些”线程。理想情况下,我想做的是使用 deferToThread 之类的机制,但要指定代码运行所在的线程。任何建议将不胜感激,也许 Twisted 是该项目的错误方式。
python - 具有高级可视化的python下的ABM
抱歉,如果这一切看起来都不太清楚,但我目前正在学习 Netlogo 来模拟基于代理的集体行为,并希望听到一些关于替代软件选择的建议。我的主要事情是我非常想利用 PyCuda,因为据我了解,它支持并行计算。但是,这是否意味着我仍然必须在其他环境中编写数字脚本并在另一个环境中实现视觉效果???
如果是这样,我的问题是:
我应该使用什么数字包?PyEvolve、DEAP 还是其他?PyEvolve 似乎不再被开发,而 DEAP 只是过时的(?)EAP 的包装。
图形方面,我发现 mayavi2 和 vtk 很有希望。问题是,没有一个数字包似乎很容易绑定到这些。除了将数值输出保存到数据文件并将它们输入到 mayavi2 之外,没有更好的选择吗?
另一种选择是通过 Netlogo 生成数据并将它们从 (2) 输入到图形包中。这样做有什么缺点吗?
非常感谢您阐明这种困惑。
python - 在 PyCuda 中实现一个新类
我是使用 pycuda 的初学者,到目前为止,我已经从“Cuda by example”一书中学到了一些如何编写内核的基本知识,我的下一个任务是使用一个已经用 C++ 编写的类,里面的内核。如何将此 .h 文件导入 pycuda?我是否必须使用 boost python 来传输这个 .h 以便可以像 python 中的任何其他模块一样导入它?问题是我只需要内核中的这个特殊变量。此类用于计算导数,我将写几行代码,以便您了解它是如何构造的:
adoublecuda.h:
...ETC。
我在 C-CUDA 中使用这个类,只需输入 #include “adoublecuda.h”,现在我想在 PyCUDA 中包含同样的东西。我只在内核内部使用这个类(我不需要 main 内部的双变量)。那么我是否必须使用 boost python 才能将此头文件包含到 PyCuda 中?
任何建议将不胜感激,感谢您帮助我!
python - 将 C++/CUDA 类传递给 PyCUDA 的 SourceModule
我有一个用 C++ 编写的类,它也使用了 cuda_runtime.h 中的一些定义,这是名为 ADOL-C 的开源项目的一部分,你可以看看这里!
这在我使用 CUDA-C 时有效,但我想以某种方式在 PyCUDA 中导入这个类,如果有可能的话。所以,我将在内核内部(不在“main”中)使用这个类来定义用于计算函数导数的特定变量。有没有办法将这个类传递给 PyCUDA 的 SourceModule?
我问了一个类似的问题,但在这里我想解释一下。因此,有一个解决方案使用 nvcc -cubin 编译我的 C 代码(感谢 talonmies),然后使用 driver.module_from_file() 导入它,但是,我想使用 SourceModule 并将这些内核写入 .py 文件中,所以它可以更加用户友好。我的示例如下所示:
...这只是一个想法,但 SourceModule 不会知道什么是“adouble”,因为它们是在类定义 adoublecuda.h 中定义的,所以我希望你现在能更好地理解我的问题。有谁知道我应该从哪里开始?如果没有,我将在 CUDA-C 中编写这个内核,并使用 nvcc -cubin 选项。
感谢帮助!
cuda - pycuda -- 错误:命令“x86_64-pc-linux-gnu-g++”失败,退出状态为 1
我安装了 sabayon linux 并尝试安装 pycuda 但尝试时收到以下错误
su -c "进行安装"
在 src/cpp/cuda.cpp:1:0 中包含的文件中:src/cpp/cuda.hpp:12:18:致命错误:cuda.h:没有此类文件或目录编译终止。错误:命令“x86_64-pc-linux-gnu-g++”失败,退出状态为 1
我必须提到我可以用 cuda 编译。
同样的事情发生,当我尝试
sudo -E sh -c “进行安装”
我的 .bashrc 是:
(当我以用户身份回显 $PATH 时,它向我显示:/opt/cuda/bin 但是当我以 root 身份尝试它时,它没有显示任何内容,我必须再次导出 PATH ......才能显示。)
python - 在 Ubuntu 上安装 Pycuda
我很难安装 pycuda。我在 Ubuntu 12.04 上运行。我首先安装了 Enthought python 发行版(即使我已经在计算机上安装了 python)。我将 enthought python 位置添加到我的 .profile 的路径中(这可以正常工作,从命令行键入 python 或 ipython 正确使用 enthought 版本)。然后我按照http://wiki.tiker.net/PyCuda/Installation/Linux/Ubuntu的说明进行操作(跳过步骤 0-1,因为我已经安装了 numpy 和 cuda)。
一切似乎都可以正常运行和安装。但是当我尝试实际使用 pycuda 时,它失败了。例如,当我尝试运行 hello_gpu.py 示例时,会发生以下情况:
或者,当我尝试从空闲导入 pycuda 包时,我得到一个不同的错误:
我怀疑问题的一部分是我在某个地方没有指定 python 解释器的正确路径,但我无法弄清楚这个错误发生在哪里。任何建议都会受到欢迎,我没有想法。