环境搭建与 CUDA 介绍_cuda path-程序员宅基地

技术标签: CUDA 编程  

欢迎访问我的博客首页


1. GPU 与 CPU


  设计 CUDA 程序有三步:CPU 把需要计算的数据从内存拷贝到显存;调用核函数让 GPU 处理显存中的数据;CPU 把结果从显存拷贝到内存。CPU 叫做主机(host),GPU 叫做设备(device)。

2. 环境搭建


  CUDA 编程的主要工作是使用 C++ 编写核函数。深度学习一般使用 Python,而且 Python 处理数据有得天独厚的优势,所以下面分别介绍使用 C++ 和 Python 调用核函数。

1. C++ 环境搭建

  GPU 需要对应版本的驱动,驱动需要对应版本的 CUDA Toolkit,CUDA Toolkit 需要对应版本的 visual studio。此外,CUDA Toolkit 对 GPU 的算力也有要求,比如 CUDA Toolkit 9 不支持 3.0 以下算力的 GPU。安装前要弄清楚硬件和软件版本。
  CUDA Toolkit 安装包中包含显卡驱动。应该先确定自己的显卡支持什么版本的 CUDA Toolkit,再确定该版本的 CUDA Toolkit 可以和哪些 visual studio 匹配。先安装好 visual studio 再安装 CUDA Toolkit。安装 CUDA Toolkit 的过程中会让选择是否安装驱动,默认是选中的,还会自动配置 visual studio 环境。

版本

2. 安装 PyCUDA

  安装 PyCUDA 前要安装 CUDA Toolkit。使用下面的命令安装 PyCUDA,如果安装出错,把下面的路径添加成环境变量。

pip install pycuda
# C:\Program Files (x86)\Windows Kits\8.1\bin\x86

3. 读取设备信息


1. 使用 C++

  一般情况下,CUDA 的源代码保存在后缀为 cu 的文件中。C++ 编译器不能识别核函数模板,所以没有核函数的 CUDA 代码可以保存在后缀为 cpp 的文件中当作 C++ 编译。CMakeLists.txt 如下:

cmake_minimum_required(VERSION 3.2)
project(cuda)

set(CUDA_PATH D:\\cudatoolkit\\NVIDIA\ GPU\ Computing\ Toolkit\\CUDA\\v8.0)
include_directories(${
    CUDA_PATH}\\include)
link_directories(${
    CUDA_PATH}\\lib\\x64)

add_executable(tcuda cuda.cpp)
target_link_libraries(tcuda cudart)

  一个简单的例子,用于输出显卡信息:

#include <iostream>
#include "cuda_runtime.h"
using namespace std;
 
int main() {
    
	int deviceCount;
	cudaGetDeviceCount(&deviceCount);
	cout << "deviceCount: " << deviceCount << endl;
	if (deviceCount == 0) {
    
		cout << "error: no devices supporting CUDA.\n";
		exit(EXIT_FAILURE);
	}

	int dev = 0;
	cudaSetDevice(dev);
	cudaDeviceProp devProps;
	cudaGetDeviceProperties(&devProps, dev);
	// 1.设备。
	cout << devProps.name << endl; // GeForce 610M
	cout << devProps.major << "." << devProps.minor << endl; // 2.1
	cout << devProps.totalConstMem << endl; // 65536 = 2^16 = 64K
	cout << devProps.totalGlobalMem << endl; // 1073741824 = 2^30 = 1G
	cout << devProps.unifiedAddressing << endl; // 1
	cout << devProps.warpSize << endl; // 32
	// 2.多处理器。
	cout << devProps.multiProcessorCount << endl; // 1
	cout << devProps.maxThreadsPerMultiProcessor << endl; // 1536
	for (auto x : devProps.maxGridSize) cout << x << " "; cout << endl; // 65535 65535 65535
	cout << devProps.regsPerMultiprocessor << endl; // 32768 = 2^15 = 32K
	cout << devProps.sharedMemPerMultiprocessor << endl; // 49152
	// 3.Block。
	cout << devProps.maxThreadsPerBlock << endl; // 1024
	for (auto x : devProps.maxThreadsDim) cout << x << " "; cout << endl; // 1024 1024 64
	cout << devProps.regsPerBlock << endl; // 32768 = 2^15 = 32K
	cout << devProps.sharedMemPerBlock << endl; // 49152
}

  maxThreadsPerBlock:1 个 block 内最多容纳的线程数量,一般为 1024。
  warpSize:线程束的大小,一般为 32。1 个 block 最多有 1024 个线程,但只有 32 个线程可以同时执行,它们的线程编号连续,执行同一条指令处理不同的数据。每个 block 内的线程数最好设置成 32 的整数倍,如果设置 32n+x(0<x<32) 个线程,最后一次仍有 32 个线程运行,但只有前 x 个线程的工作有效。
  maxThreadsPerMultiProcessor:一个多处理器最多同时调度的线程数,是 warpSize 的整数倍。

2. 使用 PyCUDA

import pycuda.driver as cuda

if __name__ == "__main__":
    cuda.init()
    print("Device count: %d." % cuda.Device.count())
    for ordinal in range(cuda.Device.count()):
        dev = cuda.Device(ordinal)
        print('Device #%d name: %s.' % (ordinal, dev.name()))
        print('Compute Capability: %d.%d.' % dev.compute_capability())
        print('Total Memory: %s GB.' % (dev.total_memory() >> 30))
        for att, value in dev.get_attributes().items():
            print(att, ':', value)

4. 参考


  1. CUDA Toolkit 下载
  2. 显卡驱动下载
  3. 安装 pycuda 出错
  4. GPU 架构
  5. windows 中使用 MinGW 编译 CUDA
  6. windows 中使用 MinGW 编译 CUDA
  7. faster-rcnn 中的 cuda
  8. pycuda 教程
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_26697045/article/details/119152510

智能推荐

android 动画动态消失,Android属性动画实现图片从左到右逐渐消失-程序员宅基地

文章浏览阅读994次。前言:dp/dip代表独立像素,dpi代表屏幕每英寸像素点的个数,px与dp的转换公式为: px = dp *(dpi / 160)一、效果图二、源代码AnimationActivity:package com.example.duoyi.clientaidl;import android.animation.Animator;import android.animation.ObjectAnim..._android 如何实现图片animation消失

visual basic_Visual Basic术语表-程序员宅基地

文章浏览阅读1k次。visual basic 32位 ( 32-bit )The number of bits that can be processed or transmitted in parallel, or the number of bits used for single element in a data format. Although this term is used througho..._visual basic virtual machine

CephFS简析-程序员宅基地

文章浏览阅读610次。Ceph简介分布式存储系统,支持对象存储,块存储,文件系统。无中心结构,系统规模和存储容量可以扩展。多副本,纠错码确保数据安全。Ceph系统架构Ceph是一种为优秀的性能、可靠性和可扩展性而设计的统一的、分布式文件系统特点:高性能,高可用,高扩展,特性丰富。 Clients:客户端(数据用户) mds:Metadata server cluster,元数据服务器(缓存和同步分布...

基于pytorch的特征图可视化_中间特征图每一层可视化pytorch,cv-程序员宅基地

文章浏览阅读5.2k次,点赞3次,收藏35次。前言在利用深度学习进行分类时,有时需要对中间的特征图进行可视化操作,看看网络都学习了哪些东西。本篇博文将简单介绍下,可视化操作。网络模型部分主要是forward部分,简单处理下。def forward(self, x): outputs = [] conv0 = self.encoder.conv1(x) conv0 = self.encoder.bn1(conv0) conv0 = self.encoder.relu(conv0) conv1 = self_中间特征图每一层可视化pytorch,cv

JavaWeb项目导致Linux服务器CPU过高的解决方案_centos7 java pid 5871 server占用cpu高-程序员宅基地

文章浏览阅读1.8k次,点赞3次,收藏12次。最近我部署在centos7上的一个项目出现了CPU达到了100%+的状态,导致项目崩溃,起初没重视,直接重启项目解决,后面项目运行了几天服务器又报警100%+了,这个时候我才意识到项目问题的严重性。然后开始查找原因,查看数据库连接池,发现数据库连接已经爆满,超过了最大连接数,review代码,发现很多数据库操作的时候没有释放连接,改代码,重新部署。这个时候项目运行算比较稳定了,但是..._centos7 java pid 5871 server占用cpu高

禁止系统运行某个进程的简单方法(代码实现)_openprocess pid4-程序员宅基地

文章浏览阅读7.5k次。转载请标明是引用于 http://blog.csdn.net/chenyujing1234 欢迎大家拍砖! 一、解决方法1、理论要对一个任意进程(包括系统安全进程和服务进程)进行指定了写相关的访问权的OpenProcess操作,只要当前进程具有SeDeDebug权限就可以了。要是一个用户是Administrator或是被给予了相应的权限,就可以具有该权限。可是,_openprocess pid4

随便推点

移动通信系统第一章复习(概念整理和问题解析)_数字调度通信系统第一章-程序员宅基地

文章浏览阅读1.5k次。问题提出:1.什么是移动通信?2.移动通信的主要特点和工作方式?3.移动通信系统的组成和常用的移动通信系统?4.移动通信的多址方式和常用技术?5.移动通信是如何发展的?6.代表性的标准化组织?概念整理:1.移动通信:通信双方至少有一方处于移动(暂时停止)状态下的通信。2.1主要特点:(1)无线电波传播复杂(2)移动台受到干扰严重(3)无线电频谱资源有限(4)对移动设备要求高(5)..._数字调度通信系统第一章

基于智能手机传感器数据的人类行为识别_基于智能手机传感器的人体行为识别研究python代码-程序员宅基地

文章浏览阅读1.8w次,点赞11次,收藏108次。原文链接: http://www.infoq.com/cn/articles/human-behavior-recognition-based-on-smart-phone-sensor-data?utm_source=tuicool&utm_medium=referral人类行为识别的目的是通过一系列的观察,对人类的动作类型、行为模式进行分析和识别,并使用自然语言等方式对其进行描述的计算机技术。由_基于智能手机传感器的人体行为识别研究python代码

运筹学_单纯形法_week3_单纯形法求解步骤思维导图-程序员宅基地

文章浏览阅读3.5k次。目录思维导图概念考察例题解析(有空再更新步骤)思维导图概念考察普通单纯形法比值规则失效说明问题无界。(√)任何变量一旦出基就不会再进基。(×)最小比值规则是保证从一个可行基得到另一个可行基。(√)xj 的检验数表示变量 xj 增加一个单位时目标函数值的改变量。(√)图解法同单纯形法虽然求解的形式不同,但从几何上理解,两者是一致的。(×)单纯形法计算中,如不按最小比值原则选取换出变量,则在下一个解中至少有一个基变量的值为负。(√)单纯形法计算中,选取最大正检验数对应的变量作为换入变量,将_单纯形法求解步骤思维导图

需求评审的维度与评分体系-程序员宅基地

文章浏览阅读5.4k次。作者:张鑫 链接:https://zhuanlan.zhihu.com/p/22342843 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。今天给大家一个思维工具,程序员们可以拿去用于评价一个产品需求是否靠谱。这个既可以用于程序员与产品经理之间的日常沟通,也可以用于公司中流程化的需求评审,甚至可以建立评分体系做大团队的数据分析。评估需求的三个维度研发人员对于产

java多线程的优势_java 多线程好处-程序员宅基地

文章浏览阅读2k次。多线程的优势1,线程在程序中是独立的,并发的执行流,但是,与分隔的进程相比,进程中的线程之间的隔离程度要小。它们共享内存,文件句柄和其他每个进程应有的状态。2,线程比进程具有更高的性能,这是由于同一个进程中的线程都有共性:多个线程将共享同一个进程虚拟空间。线程共享的环境包括:进程代码段,进程的公有数据等。利用这些共享的数据等,线程很容易实现相互之间的通信。3,当操作系统创建一个进程时,必须为进程分..._java 多线程好处

Centos 6安装完美搭建mysql、php、apache之旅_edland-1.0.7-11.el6.i686 has missing requires of l-程序员宅基地

文章浏览阅读1.4k次。Centos 6安装完美搭建mysql、php、apache之旅_edland-1.0.7-11.el6.i686 has missing requires of libmysqlclient.so.16

推荐文章

热门文章

相关标签