当我运行时,nvidia-smi我收到以下消息:
Failed to initialize NVML: Driver/library version mismatch
Run Code Online (Sandbox Code Playgroud)
一个小时前我收到了同样的消息并卸载了我的cuda库,我能够运行nvidia-smi,得到以下结果:
在此之后,我cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb从官方的NVIDIA页面下载,然后简单地:
sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda
export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
Run Code Online (Sandbox Code Playgroud)
现在我安装了cuda,但是我得到了上面提到的不匹配错误.
一些可能有用的信息:
跑步cat /proc/driver/nvidia/version我得到:
NVRM version: NVIDIA UNIX x86_64 Kernel Module 378.13 Tue Feb 7 20:10:06 PST 2017
GCC version: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)
Run Code Online (Sandbox Code Playgroud)
我正在运行Ubuntu 16.04.2 LTS.
内核版本是:4.4.0-66-generic.
谢谢!
我已经使用CUDA几周了,但我对块/ warps/thread的分配有些怀疑. 我从教学的角度(大学项目)研究建筑,所以达到最佳表现并不是我关注的问题.
首先,我想了解我是否直截了当地得到了这些事实:
程序员编写内核,并在线程块网格中组织其执行.
每个块都分配给一个流式多处理器(SM).一旦分配,它就无法迁移到另一个SM.
每个SM将其自己的块拆分为Warps(当前最大大小为32个线程).warp中的所有线程在SM的资源上并发执行.
线程的实际执行由SM中包含的CUDA核执行.线程和核心之间没有特定的映射.
如果warp包含20个线程,但目前只有16个可用核心,则warp将不会运行.
另一方面,如果一个块包含48个线程,它将被分成2个warp并且它们将并行执行,前提是有足够的内存可用.
如果线程在核心上启动,则它会因内存访问或长时间浮点操作而停止,其执行可以在不同的核心上恢复.
他们是对的吗?
现在,我有一个GeForce 560 Ti,因此根据规格,它配备了8个SM,每个包含48个CUDA核心(总共384个核心).
我的目标是确保架构的每个核心都执行相同的SAME指令.假设我的代码不需要比每个SM中可用的代码更多的寄存器,我想象了不同的方法:
我创建了8个块,每个48个线程,因此每个SM有1个块来执行.在这种情况下,48个线程将在SM中并行执行(利用它们可用的所有48个内核)?
如果我推出64个6个线程的块,有什么区别吗?(假设它们将在SM之间平均映射)
如果我在预定的工作中"淹没"GPU(例如,创建每个1024个线程的1024个块),可以合理地假设所有核心将在某个点使用,并且将执行相同的计算(假设线程永远不会失速)?
有没有办法使用Profiler检查这些情况?
这个东西有没有参考?我阅读了"编程大规模并行处理器"和"CUDA应用程序设计与开发"中的CUDA编程指南和专用于硬件架构的章节; 但我无法得到准确的答案.
我想听听有两种编码经验的人的意见.我自己,我只有NVIDIA的经验.
NVIDIA CUDA似乎比竞争对手更受欢迎.(只计算这个论坛上的问题标签,'cuda'优于'opencl'3:1,'nvidia'优于'ati '15:1,并且根本没有'ati-stream'标签.
另一方面,根据维基百科,ATI/AMD显卡应该具有更大的潜力,特别是每美元.目前市场上最快的NVIDIA显卡,GeForce 580(500美元),评级为1.6单精度TFlops.AMD Radeon 6970的售价为370美元,售价为2.7 TFlops.580具有512个执行单元,772 MHz.6970具有1536个执行单元,频率为880 MHz.
AMD相对于NVIDIA的纸张优势有多现实,是否可能在大多数GPGPU任务中实现?整数任务会发生什么?
这是一个关于如何确定CUDA网格,块和线程大小的问题.这是对此处发布的问题的另一个问题:
在此链接之后,talonmies的答案包含一个代码片段(见下文).我不理解评论"通常由调整和硬件约束选择的值".
我没有找到一个很好的解释或澄清,在CUDA文档中解释了这一点.总之,我的问题是如何在给定以下代码的情况下确定最佳块大小(=线程数):
const int n = 128 * 1024;
int blocksize = 512; // value usually chosen by tuning and hardware constraints
int nblocks = n / nthreads; // value determine by block size and total work
madd<<<nblocks,blocksize>>>mAdd(A,B,C,n);
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我从上面的链接开始我的问题,因为它部分回答了我的第一个问题.如果这不是在Stack Overflow上提问的正确方法,请原谅或建议我.
我想知道是否pytorch正在使用我的GPU.可以nvidia-smi在进程中检测GPU是否有任何活动,但我想要用python脚本编写的东西.
有办法吗?
我一直在阅读CUDA和OpenCL的编程指南,我无法弄清楚银行冲突是什么.他们只是倾向于如何解决问题而不详细说明主题本身.任何人都可以帮我理解吗?如果帮助是在CUDA/OpenCL的背景下,或者只是计算机科学中的银行冲突,我没有偏好.
我的双显示器系统上的DataGridView遇到了一个非常奇怪的问题.该问题表现为对控件的极快重复(如完全重绘的30秒),但只有在我的某个屏幕上时才会显示.在另一方面,重绘速度很好.
我有一个Nvidia 8800 GT,带有最新的非beta驱动程序(175件).这是驱动程序错误吗?我会把它留在空中,因为我必须忍受这种特殊的配置.(它不会发生在ATI卡上,但......)
绘画速度与单元格内容无关,自定义绘图根本不会改善性能 - 即使只绘制实心矩形也是如此.
我后来发现在表单上放置一个ElementHost(来自System.Windows.Forms.Integration命名空间)可以解决问题.它不必被搞砸; 它只需要是DataGridView所在的表单的子级.只要Visible属性为true ,就可以将其大小调整为(0,0).
我不想明确地将.NET 3/3.5依赖项添加到我的应用程序中; 我创建了一个方法来在运行时创建此控件(如果可以)使用反射.它工作正常,至少它在没有所需库的机器上优雅地失败 - 它只是变得缓慢.
这个方法还允许我在应用程序运行时应用修复,这样可以更容易地看到WPF库在我的表单上发生了什么变化(使用Spy ++).
经过大量的试验和错误,我注意到在控件本身上启用双缓冲(而不仅仅是表单)可以解决问题!
因此,您只需要根据DataGridView创建一个自定义类,以便启用其DoubleBuffering.而已!
class CustomDataGridView: DataGridView
{
public CustomDataGridView()
{
DoubleBuffered = true;
}
}
Run Code Online (Sandbox Code Playgroud)
只要我的所有网格实例都使用这个自定义版本,一切都很好.如果我遇到由此引起的情况,我无法使用子类解决方案(如果我没有代码),我想我可以尝试将该控件注入表单:)(虽然我'将更有可能尝试使用反射来强制从外部启用DoubleBuffered属性再次避免依赖).
令人遗憾的是,这么简单的事情花了我很多时间......
我不是3D或HPC人员,但我的任务是对可能的HPC应用程序进行一些研究.读取nVidia Quadro和Geforce卡之间的基准,比较和规格,似乎对于类似的代卡:
有谁知道可以导致这种更好性能的确切和精确的技术差异是什么?我的推测(以及通常可以在网上阅读的内容),因为硬件具有相似的规格,所以它都在驱动程序中.如果是这样的话,Quadro驱动程序提供了哪些功能,3ds Max和其他程序员可以利用这些功能?
当然,我对营销说话不感兴趣:更高的商业价值,专业导向,更好的支持,更好的质量保证等等......
CUDA核心,流式多处理器和块和线程的CUDA模型之间有什么关系?
什么被映射到什么和什么是并行化以及如何?什么是更有效,最大化块数或线程数?
我目前的理解是每个多处理器有8个cuda核心.并且每个cuda核心都能够一次执行一个cuda块.并且该块中的所有线程在该特定核心中串行执行.
它是否正确?