CUDA CPP Unity Compute Shader

news2024/12/25 12:44:33

为学

开始一个新的学习计划,涵盖:

主题学习内容
CUDAProfessional CUDA C Programming/NVIDIA CUDA初级教程视频(周斌)
C++C++Primer / The Cherno CPP
Unity Compute ShaderUdemy Learn to Write Unity Compute Shaders
Linear AlgebraMIT 18.06 Prof.Gilbert Strang Linear Algebra

本系列博客用以记录学习过程中的知识要点!!!

为学
—彭端淑
天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。人之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。

2023/4/28
〇、CUDA
1.使用nvfrof时,报错
在这里插入图片描述
解决方法:
将路径

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\extras\CUPTI\lib64 

下的文件

cupti64_2024.1.1.dll

复制到路径

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\bin

下即可。
2.nvprof的使用
Shift+鼠标右键->在此处打开PowerShell窗口(S)
在控制台中输入

nvprof E:\C_CPP_CUDA\CUDA\x64\Release\CUDATest.exe

nvprof的使用及输出
3.Win10/Win11查看CUDA Capability Major
在路径

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\extras\demo_suite

中使用Shift+鼠标右键->在此处打开PowerShell窗口(S)
然后将deviceQuery.exe拖入到PowerShell窗口中,即可查看;
注:应该可以deviceQuery.exe直接查看,可是这个控制台程序不暂停,一闪而退。
4.未解决问题
在PowerShell中使用nvcc命令编译

PS E:\C_CPP_CUDA\CUDA\CUDA>  nvcc sumArrayOnHost.cu -o sum
sumArrayOnHost.cu
nvcc error   : 'cudafe++' died with status 0xC0000005 (ACCESS_VIOLATION)

网上找的解决方法都不行呢,有知道如何解决的望告知呢;
因可在Visual Studio中直接通过调试器直接进行编译,所以命令行编译不行就不行吧。

5.CUDA 2.2 给核函数计时
a>#include <sys/time.h>
该文件应为linux系统下的头文件,在windows中可使用time.h头文件;

#include <time.h>
 int main(){
 	clock_t start=clock();
 	//do something
 	clock_t elaps=clock()-start;
 	printf("do something spent %.10f ms",elaps);
 }

6.CHECK方法中的call显示未定义

严重性	代码	说明	项目	文件	行	禁止显示状态	详细信息
错误(活动)	
E0020	未定义标识符 "call"	CUDA	E:\C_CPP_CUDA\CUDA\CUDA\sumArrayOnHost.cu	10
//后面这个反斜杠必须有啊啊啊
#define CHECK(call){															\ 
	const cudaError_t error = call;												\
	if (error != cudaSuccess) {													\
		printf("Error: %s:%d ", __FILE__, __LINE__);							\
		printf("code:%d, reason: %s\n", error, cudaGetErrorString(error));		\
		exit(1);																\
	}																			\
}			

一、CPP
1.break语句会跳出整个循环,而非内层循环;
2.C++的编译
编译包含外部代码的项目,
外部include文件添加

项目->(鼠标右键)属性->C/C++->Addtional Include Directories->"include files path"

外部lib添加

项目->(鼠标右键)属性->链接器->Addtional Library Directories->"lib path"
  1. 编译出错时,应首先聚焦第一个错误;
  2. 查看CPP文件的汇编代码
    在需要查看汇编代码的地方打断点,当代码运行至该位置时,鼠标右键->转到反汇编

2024/04/29

第一课 CPU体系架构概述

桌面应用
真正用于数值计算的指令很少

CPU程序为串行程序优化
流水线
分支预测
超标量
乱序执行
存储器层次
矢量操作
多核处理

缓慢的内存带宽(存储器带宽)是大问题

并行处理是方向

第二课 并行程序设计概述

为什么
Power Wall
Memory Wall

怎么做
数据并行处理

并行计算模式
同时应用多个计算资源解决一个计算问题

基本概念
Flynn矩阵
S single I instruction M multiple D data
SISD SIMD
MISD MIMD

常见名词

Task
Paralllel Task
Serial Execution(串行执行)
Parallel Exection
Shared Memory
Distributed Memory
Communications
Synchronizations(同步)
Granularity(粒度)
Observed Speedup
Parrallel Overhead(并行开销)
Scalability

并行编程模型
共享存储模型
线程模型
消息传递模型
数据并行模式

数据和任务分割

Amdahl’s Law
speedup=-1/1-P

没有可并行化的 P=0
全部都可以并行化 P=1

speedup=1/(P/N+S)
P=并行部分
N=处理器数
S=串行部分

并行化的可扩展性有极限

speedup
NP=.50P=.90P=.99
101.825.269.17
1001.989.1750.25
10001.999.9190.99
100001.999.9199.02

第三课 CUDA开发环境搭建和工具配置

没啥好讲的,直接装NVIDIA CUDA TOOLKIT,装Visual Studio

第四课 GPU体系架构概述

带宽是非常宝贵的资源
Bandwidth is critical resource!

带宽受限!!!
Bandwidth limited!!!

减少带宽需求

GPU是异构 众核 处理器
针对吞吐优化

第五课 GPU编程模型

CPU和GPU的交互模型

  DRAM			      	   GDRAM
	|				   		 |
   CPU			    		GPU
	|		 	PCIe         |	
	|------------------------|
	I/O						I/O	

交互开销较大

GPU线程组织模型

访存速度

GPU存储模型

GPU线程组织模型
Grid
Block
Thread

线程组织架构说明

一个Kernel具有大量线程
线程被划分成线程块“blocks”

  • 一个block内部的线程共享“Shared Memory”
  • 可以同步“_syncthreads()”

Kernel启动一个“grid”,包含若干线程块

  • 用户设定
  • 线程和线程块具有唯一的标识

有很多通俗易懂的图,后续补充

SIMT
Single Instruction Mutilple Threads

CUDA Extended C

CUDA函数声明

第五课 CUDA编程
CUDA
层次化线程集合
Grid 一维或多维线程块(block)

  • 1D/2D/3D

Block 一组线程

  • 1D/2D/3D
    • 一个Grid里面的每个Block的线程数是一样的
    • block内部的每个线程可以
      • 同步 synchronic
      • 访问共享存储器
    • 块索引 blockIdx
    • 维度 blockDim
      • 1D/2D/3D
        线程
        ThreadID threadIdx

共享存储
同步

术语
Host 主机
Device 设备

Kernel 数据并行处理函数
通过调用kernel函数在设备端创建轻量级线程
线程由硬件创建并调度

2024/04/30
线性代数
Lecture 特征值和特征向量的应用,用来三角化方阵,
讲了一个应用,求解斐波那契数列的第一百项
通过将递归式改写成一个一次差分方程,然后构造了一个矩阵,该矩阵乘以一个向量可以表述递归式,从而转化为求特征值与特征方程;

CUDA的最近几天的学习将关注于基本的代码测试结构,还在熟悉中; 已完成

线性代数会单独成一个新的或者说特别早的一个单独内容;

所以本文将拆分为两个部分
CUDA C/Compute Shader Compute Shader/C++将会致力于解决部分计算几何算法问题,因为Compute Shader是Unity引擎的进一步包装,因此会在本文起始阶段对一些简单问题在CUDA和Compute Shader中分别实现,以观察两者的区别;

Linear Algebra 理论与应用,暂定有最小二乘解的应用(QR分解,正交化,SVD,伪逆);和其他涉及向量,矩阵计算的计算几何算法,也有可能会将整合成一个新的主题,称为为数学与算法,行列式计算将关联一个几何谓词的算法问题

本文会不断更新并修改,仅做复习用,如有词不达意活谬误之处,忘指正。

2024/05/01

一、Professional CUDA C Programming

1. 代码结构

目录结构

一级目录 Ch_NO_Name
二级目录 SectionTitle(如codelist条目较少,则此级目录省略)

代码规范
  1. 命名:在全书或一章或单节内共用的方法,将其集中在以Common/Chapter/Section.cuh命名的头文件中;
  2. main函数:
    CUDA项目有多个main函数的情况下,似乎不能通过像C#有多个Main方法时通过在项目属性中设置启动项来选择以那个main方法作为入口点;因此有几种办法来达到切换启动项的目的:
    a. 在.cu的属性中去设置“从生成中排除”,但多选太麻烦
    b. 注释main方法
    我使用了b,但有所修改,为了每次注释的代码较少,因此将函数主体放在了一个名为awakeKernel(需使用static修饰词进行修饰)的方法中;在main中调用awakeKernel;
    基本结构如下
cudaTest.cu
#include <cuda_runtime.h>
#include <stdlib.h>
int awakeKernel();
//通过注释/取消注释main方法来将此文件中的main方法作为入口点
//int main(){
//	return awakeKernel();
//}
static int awakeKernel(){
	//do something interesting ...
	return 0;
}
  1. 书中同名但实现不同的方法,我们将对名称进行更一步的细化
    如第2章中有两个同名的initialData的方法都是对一个float数组进行初始化,第一个使用数组索引作为相应位置的值,第二个基于时间生成了随机值;因此将第二个改名为initialData_random;
    示例如下
#include <time.h>
#include <stdlib.h>

//
static void initialData(float* p_A, const int p_size) {
	for (size_t i = 0; i < p_size; i++)
	{
		p_A[i] = i;
	}
}
static void initialData_random(float* p_ip, int p_size) {
	time_t t;
	srand((unsigned int)time(&t));
	for (size_t i = 0; i < p_size; i++)
	{
		p_ip[i] = (float)(rand() & 0xFF) / 10.0F;
	}
}
小知识
  1. 需要通过#ifndef,#define预处理命令来定义头文件,防止头文件在多个文件中被引用时,在编译时出现多次包含的情况;
  2. 定义在头文件中的方法需要添加static关键字
    在C语言中,全局static修饰符的意思是该方法或字段只能在该文件中引用;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1638982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

typescript类型检查和原始类型

typescript类型检查和原始类型 类型检查 非严格类型是typescript默认的类型检查模式&#xff0c;在该模式下&#xff0c;类型检查的规则相对轻松&#xff0c;不会对undefined和null值做过多的限制&#xff0c;允许将undefined和null值赋给string类型的变量。进行JavaScript代…

【算法】高精度乘法

前言 最近在参加某个比赛的时候遇到了这个问题&#xff0c;用字符串表示时&#xff0c;长度能达到15&#xff0c;所以针对大数乘法写一篇文章。 高精度 * 低精度 在这种场景下&#xff0c;一般都是给定一个无法用int或long long 存储的数&#xff0c;再给定一个能用int或lon…

第74天:漏洞发现-Web框架中间件插件BurpSuite浏览器被动主动探针

目录 思维导图 前置知识 案例一&#xff1a;浏览器插件-辅助&资产&漏洞库-Hack-Tools&Fofa_view&Pentestkit 案例二&#xff1a; BurpSuite 插件-被动&特定扫描-Fiora&Fastjson&Shiro&Log4j 思维导图 前置知识 目标&#xff1a; 1. 用…

Linux 进程间通信之命名管道

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 命名管道 创建一个命名管道 …

八大排序详解:动图、代码、注释

目录 何为八大排序&#xff1f; 直接插入排序 排序过程解读 直接插入排序的特性总结&#xff1a; 希尔排序 希尔排序的特性总结&#xff1a; 直接选择排序 直接选择排序的特性总结&#xff1a; 堆排序 直接选择排序的特性总结&#xff1a; 冒泡排序 快速排序 1.Hoa…

全景剖析阿里云容器网络数据链路(七):Terway DataPath V2(Terway≥1.8.0)

作者&#xff1a;余凯 前言 近几年&#xff0c;企业基础设施云原生化的趋势越来越强烈&#xff0c;从最开始的IaaS化到现在的微服务化&#xff0c;客户的颗粒度精细化和可观测性的需求更加强烈。容器网络为了满足客户更高性能和更高的密度&#xff0c;也一直在高速的发展和演…

【JavaEE网络】网络编程及其应用概述

目录 面向字节流粘包问题 TCP异常情况TCP/UDP对比 网络层重点协议IP协议IP地址 面向字节流 粘包问题 在面向字节流的情况下&#xff0c;会产生一些其他的问题&#xff1a;粘包问题&#xff0c;这里“粘”的是“应用层数据报”&#xff0c;通过TCP read/write的数据&#xff0…

jvm 马士兵 01

01.JVM是什么 JVM是一个跨平台的标准 JVM只识别class文件&#xff0c;符合JVM规范的class文件都可以被识别

javaScript 判断闰年

接受用户输入年份 如果是闰年就弹出闰年&#xff0c;遇到平年就是弹出平年 var a prompt(请输入年份);if(a%40&&a%100!0||a%4000){alert(闰年);}else{alert(平年);}

智慧校园为师生带来的那些帮助

随着互联网技术的发展&#xff0c;学校高度重视校园信息化建设&#xff0c;越来越多的学校开始建设智能校园。智慧校园是以智慧校园建设为基础&#xff0c;为学生的校园生活和学校的日常管理带来生机和活力。 那么&#xff0c;在当代环境下建设智慧校园的必要性是什么呢&#x…

Java集合框架-容器源码分析

Java集合框架-容器&源码分析 文章目录 Java集合框架-容器&源码分析[TOC](文章目录)前言一、集合框架概述二、Collection接口及其子接口(List/Set)及实现类2.1 Collection接口中方法2.2 遍历&#xff1a;Iterator迭代器接口&foreach(5.0新特性)2.3 Connection子接口…

Java中使用Redis实现分布式锁的三种方式

1. 导语 随着软件开发领域的不断演进,并发性已经成为一个至关重要的方面,特别是在资源跨多个进程共享的分布式系统中。 在Java中,管理并发性对于确保数据一致性和防止竞态条件至关重要。 Redis作为一个强大的内存数据存储,为在Java应用程序中实现分布式锁提供了一种高效的…

WSL2连接Windows主机的Mysql

文章目录 需求查看主机IP防火墙设置Mysql设置允许远程连接WSL2连接Mysql 需求 在WSL2&#xff08;本机Ubuntu20.04&#xff09;运行的程序需要将数据写入到本机的Mysql服务器中 查看主机IP 两种办法&#xff1a; Windows主机输入 ipconfig&#xff0c;找到带有WSL后缀的部分…

第13章 软件测评相关标准

一、标准化概述 &#xff08;一&#xff09;概念 1、标准 一定范围内获得最佳秩序&#xff0c;经协商一致并由公认机构批准共同使用和重复使用的一种规范性文档&#xff0c;是标准化活动的核心产物。 2、标准化 一定范围内获得最佳秩序&#xff0c;对现实问题和潜在问题制…

ctfshow——SSRF

文章目录 web 351web 352web 353web 354web 355web 356web357web 358web 359web 360 SSRF(Server-Side Request Forgery&#xff1a;服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统…

Java | Leetcode Java题解之第64题最小路径和

题目&#xff1a; 题解&#xff1a; class Solution {public int minPathSum(int[][] grid) {if (grid null || grid.length 0 || grid[0].length 0) {return 0;}int rows grid.length, columns grid[0].length;int[][] dp new int[rows][columns];dp[0][0] grid[0][0]…

【C/C++基础实战】:用C++实现通讯录管理系统——含完整源码

文章目录 通讯录管理系统一、系统需求以及成品演示二、代码实现三、完整代码 通讯录管理系统 一、系统需求以及成品演示 1.1 系统需求 通讯录是一个可以记录亲人、好友信息的工具。这里利用C来实现一个通讯录管理系统 系统中需要实现的功能如下&#xff1a; 添加联系人&am…

【C语言】/*C语言常见概念*/

目录 前言 一、C语言是什么 二、初识编译和链接 三、什么是可执行程序 四、什么是编译器 五、什么是集成开发环境 六、mian函数的特点 七、什么是关键字 八、标识符的命名规则是什么 九、字符和ASCII码表 十、字符串和\0 十一、转义字符 十二、注释 前言 本篇文章…

[蓝桥杯2024]-PWN:fd解析(命令符转义,标准输出重定向,利用system(‘$0‘)获取shell权限)

查看保护 查看ida 这里有一次栈溢出&#xff0c;并且题目给了我们system函数。 这里的知识点没有那么复杂 方法一&#xff08;命令转义&#xff09;&#xff1a; 完整exp&#xff1a; from pwn import* pprocess(./pwn) pop_rdi0x400933 info0x601090 system0x400778payloa…

力扣刷题第0天:只出现一次的数字

目录 第一部分:题目描述 ​第二部分:题目分析 第三部分:解决方法 3.1思路1: 双指针暴力求解 3.2 思路2&#xff1a;异或运算 第四部分:总结收获 第一部分:题目描述 第二部分:题目分析 由图片分析可得&#xff0c;该题目对算法时间复杂度有一定的要求时间复杂度为O(N)&a…