首页 > 其他分享 >CUDA入门笔记

CUDA入门笔记

时间:2023-05-05 20:44:18浏览次数:57  
标签:入门 笔记 Warp 线程 cuda SM include CUDA

一个SM(Streaming Multiprocessor)中的所有SP(Streaming Processor)是分成Warp的,共享同一个Memory和Instruction Unit(指令单元)。

从硬件角度讲,一个GPU由多个SM组成(当然还有其他部分),一个SM包含有多个SP(以及还有寄存器资源,Shared Memory资源,L1cache,Scheduler,SPU,LD/ST单元等等)

GPU软硬件对应关系

SM采用的是SIMT (Single-Instruction, Multiple-Thread,单指令多线程)架构,基本的执行单元是线程束(warps),线程束包含32个线程.

线程数尽量为32的倍数,因为线程束(Warp)共享一个内存和指令。假如线程数是1,则Warp会生成一个掩码,当一个指令控制器对一个Warp单位的线程发送指令时,32个线程中只有一个线程在真正执行,其他31个进程会进入静默状态。

了解硬件的代码:

cu文件:

#include <iostream>
#include "cuda_runtime.h"
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的最大 线程束  数——Warp数:" << devProp.maxThreadsPerMultiProcessor / 32 << std::endl;
    return 0;
}

CMakeLists:

cmake_minimum_required(VERSION 3.8)
project(CUDA_TEST)

find_package(CUDA REQUIRED)

message(STATUS "cuda version: " ${CUDA_VERSION_STRING})
include_directories(${CUDA_INCLUDE_DIRS})

cuda_add_executable(cuda_test src/test001.cu)
target_link_libraries(cuda_test ${CUDA_LIBRARIES})

 

标签:入门,笔记,Warp,线程,cuda,SM,include,CUDA
From: https://www.cnblogs.com/chenlinchong/p/17375301.html

相关文章

  • selenium笔记之一些个人经验
    记录我避过坑之后,自认为好用的一些方法一、元素定位不再赘述有多少种类了虽然很多,但是我尝试使用用的最多最稳定的还是:.xpath这是我认为也是我用着最靠谱的一种方法二、点击我最开始看文档,用的是element.click()方法,但是发现,有些“变动”的元素或者一些其它可点击的标签不......
  • 【CacheLine】关于缓存行的笔记(存疑)
    什么是缓存行Cache是由很多个cacheline组成的。每个cacheline通常是64字节,并且它有效地引用主内存中的一块儿地址。一个Java的long类型变量是8字节,因此在一个缓存行中可以存8个long类型的变量。CPU每次从主存中拉取数据时,会把相邻的数据也存入同一个cacheline。在访问一......
  • RuntimeError: CUDA error: out of memory.
    RuntimeError:CUDAerror:outofmemory.CUDAkernelerrorsmightbeasynchronouslyreportedatsomeotherAPIcall,sothestacktracebelowmightbeincorrect.FordebuggingconsiderpassingCUDA_LAUNCH_BLOCKING=1.这个error的原因是,当期指定的GPU的显存不足,可......
  • 「学习笔记」AC 自动机
    「学习笔记」AC自动机点击查看目录目录「学习笔记」AC自动机算法问题思路代码例题KeywordsSearch玄武密码单词病毒最短母串文本生成器背单词密码禁忌前置:「学习笔记」字符串基础:Hash,KMP与Trie。好像对例题的讲解越来越抽象了?算法问题求\(n\)个单词在一个长度为\(......
  • Flask - 基础知识入门解析
    Flask-基础知识入门解析框架比较Djangoweb框架:优点-组件非常全,教科书框架,adminmodel-ORMsession缺点-资源浪费,因为组件多,大,还是互相关联的,随便卸载组件,可能会造成项目的崩溃Flaskweb框架:优点-扩展性强,精简,简单,第三方组件丰富sessionFlask-SessionFlask-Adm......
  • 记录-Symbol学习笔记
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助Symbol是JavaScript中的原始数据类型之一,它表示一个唯一的、不可变的值,通常用作对象属性的键值。由于Symbol值是唯一的,因此可以防止对象属性被意外地覆盖或修改。以下是Symbol的方法和属性整理:属性Symbol.length......
  • C# 使用AForge调用笔记本摄像头拍照及录像
    1、添加引用1、官网下载链接:http://www.aforgenet.com/framework/downloads.html2、通过管理Nuget程序包可直接添加以下引用,当然这里并没有全部用上,而只是用上了一部分在添加完这些引用之后VS的工具箱当中会多出AForge.NET相关的一些控件,而实现调用摄像头就需要使用到这些控件......
  • 52班JAVA入门基础课堂代码
    Demo01_数组的概念和定义格式packageday01;publicclassDemo01_数组的概念和定义格式{publicstaticvoidmain(String[]args){//intage=19;//容器大小,同类型的元素,长度----元素的个数////数组---容器的一种,长度固定,......
  • Go语言入门14(channel通道01)
    channel(一)​ channel用于goroutines之间的通信,让它们之间可以进行数据交换。像管道一样,一个goroutine_A向channel_A中放数据,另一个goroutine_B从channel_A取数据channel基本语法//因为channel是指针类型的数据类型,所以通过make来分配内存//使用make声明一个channel,里面可以......
  • 人工智能学习入门学习笔记 1
    目前人工智能算法分哪几类,哪些是需要训练的?人工智能算法通常可以分为以下几类:1. 监督学习(SupervisedLearning):需要有标注数据,即输入数据与输出结果是已知的,算法通过学习这些数据来建立一个输入到输出的映射模型。例如,图像分类、自然语言处理和预测等任务。2. 无监督学习(Unsupervi......