我还以为不会有人看呢, 得认知整理一下, 写的有问题的话可以提出交流。
RTX 2060 是一款NVIDIA推出的显卡,其支持 CUDA 加速技术,下面将详细介绍其支持的情况和使用方法。
CUDA 是一种针对NVIDIA GPU的并行计算平台和编程模型,通过 CUDA 编写程序可以利用GPU的并行处理能力加速计算。对于 RTX 2060 来说,其采用了 Turing 架构,支持 CUDA 10.1 和以上版本,可以充分发挥GPU的计算能力。
参考网站
CUDA学习:Windows下的CUDA环境配置_cuda环境变量-程序员宅基地
主要干两件事:
(1) 安装两个API,CUDA提供两层API接口,CUDA驱动(driver)API 和 CUDA运行时(runtime)API。所以要安装两个API,一个是显卡驱动(drivers),一个是cuda运行时工具包(toolkit)。它们的关系如图所示。
(2)Visual Studio 开发环境配置。
要使用nvidia-smi
指令,必须先安装NUIDIA的CUDA驱动,一般会自带驱动,只是版本不是最新的。
打开终端,输入nvidia-smi
,本机显卡的显卡驱动版本为:551.86(driver) CUDA支持版本为:12.4(toolkit)(这个是我安装好之后的)。
在查看完电脑的显卡信息后,需要对显卡驱动版本和CUDA版本对应的CUDA Toolkit工具包进行确认.
或者使用“DirectX诊断工具”查看显卡信息:
按下“Win+R”组合键打开“运行”,输入“dxdiag”。
点击“确定”后,在“DirectX诊断工具”中可以看到显卡型号、显存容量等详细信息。
地址:Official Drivers | NVIDIA
search之后直接点击下载
地址:CUDA Toolkit Archive | NVIDIA Developer
安装完毕后也可以通过nvidia-smi
指令查看安装的对不对。
查看环境变量
安装完成后,系统环境变量中自动被添加上了如下所示的两个环境变量(版本号对应用户所下载的版本号)。
添加环境变量:
用户需要手动添加以下的环境变量:
CUDA_BIN_PATH=%CUDA_PAT%\bin
CUDA_LIB_PATH=%CUDA_PATH%\lib\x64
CUDA_SDK_BIN_PATH=%CUDA_SDK_PATH%\bin\win64
CUDA_SDK_LIB_PATH=%CUDA_SDK_PATH%\common\lib\x64
CUDA_SKD_PATH=C:\ProgramData\NVIDIA Corporation\CUDA Sample\v12.4
添加上述环境变量后,在系统环境变量Path中添加下列路径:
%CUDA_BIN_PATH%
%CUDA_LIB_PATH%
%CUDA_SDK_BIN_PATH%
%CUDA_SDK_LIB_path%
在命令行中输入:nvcc --version
查看nvcc编译器版本,如下图所示
在命令行中输入:set cuda
,查看设置的环境变量情况.如下所示:
进入目录:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\extras\demo_suite
终端执行deviceQuery.exe 结果如下 ,运行结果为result=PASS
则说明CUDA安装成功。
deviceQuery.exe Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
Detected 1 CUDA Capable device(s)
Device 0: "NVIDIA GeForce RTX 2060"
CUDA Driver Version / Runtime Version 12.4 / 12.4
CUDA Capability Major/Minor version number: 7.5
Total amount of global memory: 6144 MBytes (6442123264 bytes)
(30) Multiprocessors, ( 64) CUDA Cores/MP: 1920 CUDA Cores
GPU Max Clock rate: 1350 MHz (1.35 GHz)
Memory Clock rate: 5501 Mhz
Memory Bus Width: 192-bit
L2 Cache Size: 3145728 bytes
Maximum Texture Dimension Size (x,y,z) 1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
Maximum Layered 1D Texture Size, (num) layers 1D=(32768), 2048 layers
Maximum Layered 2D Texture Size, (num) layers 2D=(32768, 32768), 2048 layers
Total amount of constant memory: zu bytes
Total amount of shared memory per block: zu bytes
Total number of registers available per block: 65536
Warp size: 32
Maximum number of threads per multiprocessor: 1024
Maximum number of threads per block: 1024
Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)
Maximum memory pitch: zu bytes
Texture alignment: zu bytes
Concurrent copy and kernel execution: Yes with 2 copy engine(s)
Run time limit on kernels: Yes
Integrated GPU sharing Host Memory: No
Support host page-locked memory mapping: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support: Disabled
CUDA Device Driver Mode (TCC or WDDM): WDDM (Windows Display Driver Model)
Device supports Unified Addressing (UVA): Yes
Device supports Compute Preemption: Yes
Supports Cooperative Kernel Launch: Yes
Supports MultiDevice Co-op Kernel Launch: No
Device PCI Domain ID / Bus ID / location ID: 0 / 1 / 0
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 12.4, CUDA Runtime Version = 12.4, NumDevs = 1, Device0 = NVIDIA GeForce RTX 2060
**Result = PASS**
终端执行bandwidthTest.exe 结果如下 ,运行结果为result=PASS
则说明CUDA安装成功。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\extras\demo_suite>bandwidthTest.exe
[CUDA Bandwidth Test] - Starting...
Running on...
Device 0: NVIDIA GeForce RTX 2060
Quick Mode
Host to Device Bandwidth, 1 Device(s)
PINNED Memory Transfers
Transfer Size (Bytes) Bandwidth(MB/s)
33554432 6497.3
Device to Host Bandwidth, 1 Device(s)
PINNED Memory Transfers
Transfer Size (Bytes) Bandwidth(MB/s)
33554432 6425.2
Device to Device Bandwidth, 1 Device(s)
PINNED Memory Transfers
Transfer Size (Bytes) Bandwidth(MB/s)
33554432 144153.3
Result = PASS
NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.
打开VS2019,新建空项目,右键项目,选择“生成依赖项”,选择“生成自定义”,在"生成自定义"中勾选"CUDA",如下所示:
在空项目中新建后缀为.cu
的源文件.右键该文件,选择"属性"->“常规”->“项类型”.将"项类型设置为:CUDA C/C++
.如下所示:
完成上述步骤后进行项目配置.右键项目,选择属性.配置选所有配置(即debug和Realise配置一致).
然后分平台(x64和win32)分别进行配置
x64平台下的配置
项目->“属性”->“配置属性”->“VC++目录”->"包含目录
添加包含目录:$(CUDA_PATH)\include
“VC++目录”->“库目录”
添加库目录:$(CUDA_PATH)\lib\x64
“配置属性”->“链接器”->“输入”->“附加依赖项”
添加库文件(库文件数量较多,默认存储路径为C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3\lib\x64,可在该路径下自己添加依赖项):
cublas.lib;cuda.lib;cudadevrt.lib;cudart.lib;cudart_static.lib;OpenCL.lib
Win32平台下的配置
添加库目录:$(CUDA_PATH)\lib\Win32
添加库文件(Win32平台与x64平台的库文件不相同):
cuda.lib;cudadevrt.lib;cudart.lib;cudart_static.lib;OpenCL.lib
在VS2019的"扩展"->“管理扩展"中联机搜索"nsight”,下载"NVIDIA Nsight Intergration"的扩展组件,用于在VS中调试GPU代码.如下所示.
拓展下载完成后,可以使用该扩展对GPU代码进行编程.
在GPU的核函数中添加断点,点击"Start CUDA Debugging(Next-Gen)“便可进入GPU代码的调试,调试过程与VS调试CPU代码相同
使用"CUDA Debugging"只能对GPU部分的代码进行调试,即只能对核函数进行调试,不能对CPU代码进行调试
使用VS2019中的"本地Windows调试器”**只能对CPU部分的代码进行调试,无法调试GPU部分的代码
使用下面给出的测试程序进行测试,查看能否正常运行.
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include<iostream>
#include <stdio.h>
using namespace std;
constexpr size_t MAXSIZE = 20;
__global__ void addKernel(int* const c, const int* const b, const int* const a)
{
int i = threadIdx.x;
c[i] = a[i] + b[i];
}
int main()
{
constexpr size_t length = 6;
int host_a[length] = {
1,2,3,4,5,6 };
int host_b[length] = {
10,20,30,40,50,60 };
int host_c[length];
//为三个向量在GPU上分配显存
int* dev_a, *dev_b, *dev_c;
cudaMalloc((void**)&dev_c, length * sizeof(int));
cudaMalloc((void**)&dev_a, length * sizeof(int));
cudaMalloc((void**)&dev_b, length * sizeof(int));
//将主机端的数据拷贝到设备端
cudaMemcpy(dev_a, host_a, length * sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, host_b, length * sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(dev_c, host_c, length * sizeof(int), cudaMemcpyHostToDevice);
//在GPU上运行核函数,每个线程进行一个元素的计算
addKernel << <1, length >> > (dev_c, dev_b, dev_a);
//将设备端的运算结果拷贝回主机端
cudaMemcpy(host_c, dev_c, length * sizeof(int), cudaMemcpyDeviceToHost);
//释放显存
cudaFree(dev_a);
cudaFree(dev_b);
cudaFree(dev_c);
for (int i = 0; i < length; ++i)
cout << host_c[i] << " ";
cout << endl;
getchar();
system("pause");
return 0;
}
结果: 11 22 33 44 55 66
#include <stdio.h>
#include <cuda_runtime.h>
#define N 10000
__global__ void add(int *a, int *b, int *c)
{
int tid = blockIdx.x * blockDim.x + threadIdx.x; // 计算线程ID
if(tid < N)
c[tid] = a[tid] + b[tid]; // 计算向量元素和
}
int main()
{
int a[N], b[N], c[N];
int *dev_a, *dev_b, *dev_c;
cudaMalloc((void**)&dev_a, N * sizeof(int));
cudaMalloc((void**)&dev_b, N * sizeof(int));
cudaMalloc((void**)&dev_c, N * sizeof(int));
for(int i = 0; i < N; i++)
{
a[i] = i;
b[i] = i;
}
cudaMemcpy(dev_a, a, N * sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, b, N * sizeof(int), cudaMemcpyHostToDevice);
add<<<(N + 255) / 256, 256>>>(dev_a, dev_b, dev_c); // 启动CUDA核函数
cudaMemcpy(c, dev_c, N * sizeof(int), cudaMemcpyDeviceToHost);
cudaFree(dev_a);
cudaFree(dev_b);
cudaFree(dev_c);
int sum = 0;
for(int i = 0; i < N; i++)
sum += c[i];
printf("The sum is %d\n", sum); // 输出向量和
return 0;
}
结果:The sum is 99990000
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include<iostream>
int main()
{
int dev = 0;
cudaDeviceProp devProp;
cudaGetDeviceProperties(&devProp, dev);
std::cout << "使用GPU device " << dev << ": " << devProp.name << std::endl;
std::cout << "SM的数量:" << devProp.multiProcessorCount << std::endl;
std::cout << "每个线程块的共享内存大小:" << devProp.sharedMemPerBlock / 1024.0 << " KB" << std::endl;
std::cout << "每个线程块的最大线程数:" << devProp.maxThreadsPerBlock << std::endl;
std::cout << "每个SM的最大线程数:" << devProp.maxThreadsPerMultiProcessor << std::endl;
std::cout << "每个SM的最大线程束数:" << devProp.maxThreadsPerMultiProcessor / 32 <<std::endl;
return 0;
}
结果:
使用GPU device 0: NVIDIA GeForce RTX 2060
SM的数量:30
每个线程块的共享内存大小:48 KB
每个线程块的最大线程数:1024
每个SM的最大线程数:1024
每个SM的最大线程束数:32
使用win中Linux 的 Windows 子系统 (WSL)
错误:下载CUDA Toolkit版本太低了
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x8007019e
Error: 0x8007019e ??????? Linux ? Windows ????
处理:
这个错误信息 WslRegisterDistribution failed with error: 0x8007019e
是在安装适用于 Linux 的 Windows 子系统 (WSL) 时遇到的。错误代码 0x8007019e
通常表示 ERROR_INVALID_FUNCTION
,意味着你尝试调用的函数或操作在当前的上下文或配置中是不允许的。
WSL 未启用:确保你已经启用了 WSL 功能。你可以通过打开“控制面板” > “程序” > “程序和功能” > “启用或关闭 Windows 功能”,然后勾选“适用于 Linux 的 Windows 子系统”和“虚拟机平台”(如果需要运行 WSL 2)来启用它。
【AI】搭建Windows Linux子系统(WSL2)CUDA环境_wsl安装cuda toolkit-程序员宅基地
[INFO]: Executing NVIDIA-Linux-x86_64-418.87.00.run --ui=none --no-questions --accept-license --disable-nouveau --no-cc-version-check --install-libglvnd 2>&1
[INFO]: Finished with code: 256
[ERROR]: Install of driver component failed.
[ERROR]: Install of 418.87.00 failed, quitting
在Windows Subsystem for Linux (WSL) 中安装CUDA Toolkit时遇到的问题提示表明驱动组件安装失败,这通常是因为WSL不支持直接安装NVIDIA显卡驱动。WSL主要用于在Windows环境中运行Linux二进制文件,它并不支持GPU加速,因此不能安装CUDA驱动。
CUDA Toolkit中的驱动组件是针对直接运行在物理硬件上的Linux系统设计的,用于与NVIDIA GPU进行通信。然而,WSL并不直接访问物理GPU硬件,因此不能安装和使用这些驱动。
文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文
文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作 导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释: cwy_init/init_123..._达梦数据库导入导出
文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js
文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6
文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输
文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...
文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure
文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割
文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答
文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。
文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入
文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf