想建立什么网站,如何让百度能查到自己,做一个网站要什么样技术,安徽新网讯科技发展有限公司前言#xff1a;
CUDA#xff08;Compute Unified Device Architecture#xff0c;统一计算设备架构#xff09;是由NVIDIA公司开发的一种并行计算平台和编程模型。CUDA于2006年发布#xff0c;旨在通过图形处理器#xff08;GPU#xff09;解决复杂的计算问题。在早期…前言
CUDACompute Unified Device Architecture统一计算设备架构是由NVIDIA公司开发的一种并行计算平台和编程模型。CUDA于2006年发布旨在通过图形处理器GPU解决复杂的计算问题。在早期GPU主要用于图像处理和游戏渲染但随着技术的发展其并行计算能力被广泛应用于科学计算、工程仿真、深度学习等领域。
CUDA的工作原理
CUDA的核心思想是将计算任务分配给GPU上的大量线程这些线程可以并行地执行任务从而实现高性能计算。CUDA将GPU划分为多个独立的计算单元称为“流处理器”Streaming Processor这些流处理器可以独立地执行指令互相加不干扰。 硬件层面
1、CUDA核心 (CUDA Core)
CUDA核心是执行线程计算的基本硬件单元。每个CUDA核心可以执行一个线程的计算任务。 2、SM (Streaming Multiprocessor)
流多处理器 (SM) 是由多个CUDA核心组成的集成单元。每个SM负责管理和执行一个或多个线程块。SM内部有共享内存和缓存用于加速数据访问和计算。
3、设备 (Device)
设备指的是整个GPU硬件。一个设备包含多个SM能够处理大量并行计算任务。设备通过高带宽的内存和数据传输机制与主机如CPU进行数据交换。 软件层面
1、线程 (Thread)
在CUDA编程中线程是执行基本计算任务的最小单位。每个线程执行相同的程序代码但可以处理不同的数据。 2、线程块 (Thread Block)
线程块是由多个线程组成的集合。线程块中的线程可以共享数据并且可以通过同步机制来协调彼此的工作。线程块的大小在程序执行时是固定的。 3、网格 (Grid)
网格是由多个线程块组成的更大集合。网格中的所有线程块并行执行任务网格的大小也在程序执行时固定。 示例
实现两个向量相加 arr_c[] arr_a[] arr_b[]
#include cuda.h
#include cuda_runtime_api.h#include cmath
#include iostream#define CUDA_CHECK(call) \{ \const cudaError_t error call; \if (error ! cudaSuccess) { \fprintf(stderr, Error: %s:%d, , __FILE__, __LINE__); \fprintf(stderr, code: %d, reason: %s\n, error, \cudaGetErrorString(error)); \exit(1); \} \}__global__ void addKernel(float *pA, float *pB, float *pC, int size)
{int index blockIdx.x * blockDim.x threadIdx.x; // 计算当前数组中的索引if (index size)return;pC[index] pA[index] pB[index];
}int main()
{float a[16] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};float b[16] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};int arr_len 16;float *dev_a, *dev_b, *dev_c;CUDA_CHECK(cudaMalloc(dev_a, sizeof(float) * arr_len));CUDA_CHECK(cudaMalloc(dev_b, sizeof(float) * arr_len));CUDA_CHECK(cudaMalloc(dev_c, sizeof(float) * arr_len));CUDA_CHECK(cudaMemcpy(dev_a, a, sizeof(float) * arr_len, cudaMemcpyHostToDevice));CUDA_CHECK(cudaMemcpy(dev_b, b, sizeof(float) * arr_len, cudaMemcpyHostToDevice));int *count;CUDA_CHECK(cudaMalloc(count, sizeof(int)));CUDA_CHECK(cudaMemset(count, 0, sizeof(int)));addKernelarr_len 512 - 1, 512(dev_a, dev_b, dev_c, arr_len);float *output (float *)malloc(arr_len * sizeof(float));CUDA_CHECK(cudaMemcpy(output, dev_c, sizeof(float) * arr_len, cudaMemcpyDeviceToHost));std::cout output add std::endl;for (int i 0; i arr_len; i) {std::cout output[i];}std::cout std::endl;return 0;
}
代码理解
addKernelarr_len 512 - 1, 512
函数类型如下
addKerneldim3 grid, dim3 block
前面的表达等价于
addKernel(dim3 grid(arr_len 512 - 1), 1, 1), dim3 block(512, 1, 1)
grid 与block 理解
假设只使用16个元素 arr_len 16
1、使用调整block的参数
1.1只有x:
dim3 grid(1, 1, 1), block(arr_len, 1, 1); // 一个block里面有16个线程 // 设置参数 此时遍历的代码如下
__global__ void addKernel(float *pA, float *pB, float *pC, int size){// block是一维的 int index threadIdx.x; // 计算当前数组中的索引 if (index size) return; pC[index] pA[index] pB[index];}
1.2 含有x, y
dim3 grid(1, 1, 1), block(8, 2, 1); //每个block x方向有8个线程总共2组。 __global__ void addKernel(float *pA, float *pB, float *pC, int size){ // block是二维的 int index threadIdx.x blockDim.x* threadIdx.y; // 计算当前数组中的索引 if (index size) return; pC[index] pA[index] pB[index];}
2、更改grid 参数
2.1 只更改x方向的参数
dim3 grid(16, 1, 1), block(1, 1, 1); //还有16个block, 每个block就一个线程 // 设置参数 __global__ void addKernel(float *pA, float *pB, float *pC, int size){ // grid.x是一维的 int index blockIdx.x; // 计算当前数组中的索引 if (index size) return; pC[index] pA[index] pB[index];}
3、grid, block参数都改
3.1 grid block各改一个
dim3 grid(4, 1, 1), block(4, 1, 1) // 代码还有4个x方向block, 每个block x方向有4个线程 __global__ void addKernel(float *pA, float *pB, float *pC, int size){ // grid.x是一维的 int index blockIdx.x*gridDim.x threadIdx.x; // 计算当前数组中的索引 if (index size) return; pC[index] pA[index] pB[index];}
3.2 grid block更改两个
dim3 grid(2, 2, 1), block(2, 2, 1) // 代码还有2个X方向block,Y方向上有两组 每个block x方向有2个线程 y方向上有两组 __global__ void addKernel(float *pA, float *pB, float *pC, int size){ // 在第几个块中 * 块的大小 块中的x, y维度几行几列 int index (blockIdx.y * gridDim.x blockIdx.x) * (blockDim.x * blockDim.y) threadIdx.y * blockDim.y threadIdx.x; if (index size) return; pC[index] pA[index] pB[index];}
总结
CUDA作为一种强大的并行计算平台和编程模型极大地推动了高性能计算、深度学习等领域的快速发展。通过掌握CUDA开发者可以充分利用GPU的并行计算能力显著提升程序的运行效率和性能。无论是科学研究还是商业应用CUDA都提供了广阔的可能性和机遇。
关注我的公众号auto_driver_ai(Ai fighting), 第一时间获取更新内容。 文章转载自: http://www.morning.jjpk.cn.gov.cn.jjpk.cn http://www.morning.mstbbs.com.gov.cn.mstbbs.com http://www.morning.iterlog.com.gov.cn.iterlog.com http://www.morning.hsksm.cn.gov.cn.hsksm.cn http://www.morning.cyjjp.cn.gov.cn.cyjjp.cn http://www.morning.czlzn.cn.gov.cn.czlzn.cn http://www.morning.hqllj.cn.gov.cn.hqllj.cn http://www.morning.nfyc.cn.gov.cn.nfyc.cn http://www.morning.tlzbt.cn.gov.cn.tlzbt.cn http://www.morning.rcww.cn.gov.cn.rcww.cn http://www.morning.nyhtf.cn.gov.cn.nyhtf.cn http://www.morning.pycpt.cn.gov.cn.pycpt.cn http://www.morning.cnqdn.cn.gov.cn.cnqdn.cn http://www.morning.ljwyc.cn.gov.cn.ljwyc.cn http://www.morning.qwmpn.cn.gov.cn.qwmpn.cn http://www.morning.wbrf.cn.gov.cn.wbrf.cn http://www.morning.whnps.cn.gov.cn.whnps.cn http://www.morning.hrjrt.cn.gov.cn.hrjrt.cn http://www.morning.wqcbr.cn.gov.cn.wqcbr.cn http://www.morning.hxbps.cn.gov.cn.hxbps.cn http://www.morning.gjqnn.cn.gov.cn.gjqnn.cn http://www.morning.mxlmn.cn.gov.cn.mxlmn.cn http://www.morning.ljcf.cn.gov.cn.ljcf.cn http://www.morning.nbsbn.cn.gov.cn.nbsbn.cn http://www.morning.fhqdb.cn.gov.cn.fhqdb.cn http://www.morning.nfsrs.cn.gov.cn.nfsrs.cn http://www.morning.fdxhk.cn.gov.cn.fdxhk.cn http://www.morning.qrnbs.cn.gov.cn.qrnbs.cn http://www.morning.kltsn.cn.gov.cn.kltsn.cn http://www.morning.bnkcl.cn.gov.cn.bnkcl.cn http://www.morning.gmysq.cn.gov.cn.gmysq.cn http://www.morning.nyjgm.cn.gov.cn.nyjgm.cn http://www.morning.lwtld.cn.gov.cn.lwtld.cn http://www.morning.tbstj.cn.gov.cn.tbstj.cn http://www.morning.rxkq.cn.gov.cn.rxkq.cn http://www.morning.jyyw.cn.gov.cn.jyyw.cn http://www.morning.fglzk.cn.gov.cn.fglzk.cn http://www.morning.fmrwl.cn.gov.cn.fmrwl.cn http://www.morning.zbmcz.cn.gov.cn.zbmcz.cn http://www.morning.ruifund.com.gov.cn.ruifund.com http://www.morning.heleyo.com.gov.cn.heleyo.com http://www.morning.lbbgf.cn.gov.cn.lbbgf.cn http://www.morning.rbknf.cn.gov.cn.rbknf.cn http://www.morning.rpwck.cn.gov.cn.rpwck.cn http://www.morning.pdynk.cn.gov.cn.pdynk.cn http://www.morning.srsln.cn.gov.cn.srsln.cn http://www.morning.nmtyx.cn.gov.cn.nmtyx.cn http://www.morning.rgxcd.cn.gov.cn.rgxcd.cn http://www.morning.rkfwr.cn.gov.cn.rkfwr.cn http://www.morning.rswfj.cn.gov.cn.rswfj.cn http://www.morning.nxhjg.cn.gov.cn.nxhjg.cn http://www.morning.jkcnq.cn.gov.cn.jkcnq.cn http://www.morning.qwwhs.cn.gov.cn.qwwhs.cn http://www.morning.ltxgk.cn.gov.cn.ltxgk.cn http://www.morning.hrhwn.cn.gov.cn.hrhwn.cn http://www.morning.ntzfl.cn.gov.cn.ntzfl.cn http://www.morning.xirfr.cn.gov.cn.xirfr.cn http://www.morning.bmssj.cn.gov.cn.bmssj.cn http://www.morning.jcxyq.cn.gov.cn.jcxyq.cn http://www.morning.txzmy.cn.gov.cn.txzmy.cn http://www.morning.tzkrh.cn.gov.cn.tzkrh.cn http://www.morning.dcpbk.cn.gov.cn.dcpbk.cn http://www.morning.ydrn.cn.gov.cn.ydrn.cn http://www.morning.nrfqd.cn.gov.cn.nrfqd.cn http://www.morning.pwhjr.cn.gov.cn.pwhjr.cn http://www.morning.kqylg.cn.gov.cn.kqylg.cn http://www.morning.hrzymy.com.gov.cn.hrzymy.com http://www.morning.rjjjk.cn.gov.cn.rjjjk.cn http://www.morning.nwfpl.cn.gov.cn.nwfpl.cn http://www.morning.mpflb.cn.gov.cn.mpflb.cn http://www.morning.txysr.cn.gov.cn.txysr.cn http://www.morning.mkxxk.cn.gov.cn.mkxxk.cn http://www.morning.qlsbz.cn.gov.cn.qlsbz.cn http://www.morning.xtgzp.cn.gov.cn.xtgzp.cn http://www.morning.kszkm.cn.gov.cn.kszkm.cn http://www.morning.yqzyp.cn.gov.cn.yqzyp.cn http://www.morning.mjyrg.cn.gov.cn.mjyrg.cn http://www.morning.txltb.cn.gov.cn.txltb.cn http://www.morning.sgpny.cn.gov.cn.sgpny.cn http://www.morning.hctgn.cn.gov.cn.hctgn.cn