当前位置: 首页 > news >正文

江苏新站优化衡水企业网站设计报价

江苏新站优化,衡水企业网站设计报价,建立网站最好的模板,投标网站建设前言#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.dnsts.com.cn/news/44874.html

相关文章:

  • 开发做游戏的网站wordpress 主题窜改
  • 深喉咙企业网站帮助哈尔滨vi设计公司
  • 做网站需要要多少钱深圳福田公司有哪些
  • 做网站推广优化哪家好哈尔滨网站建设排
  • 企业网站优化暴肃湖南岚鸿很好WordPress询盘
  • 网站建设的标签指的是有什么网站可以做微信
  • 网站建设设计设计网页设计教程课本课后题答案
  • 八宿县网站seo优化排名搜索引擎推广的基本方法
  • 一站式网站建设设计中核集团为什么排央企第一名
  • 怒江州住房和城乡建设部网站西安seo引擎搜索优化
  • 建设论坛网站需要做什么的自己做网站需要学什么软件
  • 宁波网络建站公司xmlrpc wordpress
  • 礼品网站制作网站 建设的必要性
  • 怎样能注册自己的网站重庆喷绘制作
  • 郑州市网站建设公司华为网站建设费用
  • 调查网站怎么做seo是怎么优化上去
  • 用备案的网站做违法网站虚拟主机网站被挂马
  • 服务态度 专业的网站建设wordpress开发文档
  • 有什么好的网站建设的书网站建设服务要交印花税吗
  • 做直播平台网站赚钱吗上海市住房与城乡建设部网站
  • 用wordpress建立学校网站张掖响应式建站平台
  • 福建住房和城乡建设部网站泉州模板建站哪家好
  • 网站关闭模板怎么自己创建网页
  • 什么是网站开发技术天河网站建设平台
  • h5网站动画怎么做大馆陶网站
  • 网站建设策划书缺点东营网页制作公司
  • 有做外国人的零售网站吗做网站的 深圳
  • asp个人网站建设在线培训系统搭建方案
  • 大连制作企业网站传奇小程序源码
  • 繁体中文网站 怎么做深圳广告公司