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

cuda 内核启动

C++ 使用 __global__ 声明说明符定义内核,并使用新的 <<<...>>> 执行配置语法指定内核调用的 CUDA 线程数(请参阅 C++ 语言扩展)。 每个执行内核的线程都有一个唯一的线程 ID,可以通过内置变量在内核中访问。

示例代码使用内置变量 threadIdx 将两个大小为 N 的向量 A 和 B 相加,并将结果存储到向量 C 中:

#include <cuda_runtime_api.h>
#include <iostream>#define RANDOM(x) (rand() % x)
#define MAX 10// single block multiple threads
__global__ void vector_add_gpu_2(int *d_a, int *d_b, int *d_c, int n){int tid = threadIdx.x;const int t_n = blockDim.x;while(tid < n){d_c[tid] = d_a[tid] + d_b[tid];tid+=t_n;}
}int main(){/***向量相加的实现***/int n = 5;int *a = (int *)malloc(sizeof(int)*n);int *b = (int *)malloc(sizeof(int)*n);int *c = (int *)malloc(sizeof(int)*n);for (size_t i = 0; i<n; i++){a[i] = RANDOM(MAX);b[i] = RANDOM(MAX);std::cout << a[i] << "   " << b[i] << std::endl;}cudaError_t  cudaStatus;// GPU memory allocateint *d_a, *d_b, *d_c;cudaMalloc((void **)&d_a, sizeof(int)*n);cudaMalloc((void **)&d_b, sizeof(int)*n);cudaMalloc((void **)&d_c, sizeof(int)*n);// data a and b copy to GPUcudaStatus = cudaMemcpy(d_a, a, sizeof(int)*n, cudaMemcpyHostToDevice);if (cudaStatus != cudaSuccess) {std::cout << ("Memory copy failed! error code: %s", cudaGetErrorString(cudaStatus)) << std::endl;}cudaStatus = cudaMemcpy(d_b, b, sizeof(int)*n, cudaMemcpyHostToDevice);if (cudaStatus != cudaSuccess) {std::cout << ("Memory copy failed! error code: %s", cudaGetErrorString(cudaStatus)) << std::endl;}vector_add_gpu_2<<<1, 3>>>(d_a, d_b, d_c, n);// result copy back to CPUcudaMemcpy(c, d_c, sizeof(int)*n, cudaMemcpyDeviceToHost);std::cout << "the result of add is: " << std::endl;for (size_t i = 0; i<n; i++){std::cout << c[i] << " ";}std::cout << std::endl;// GPU memory freecudaFree(d_a);cudaFree(d_b);cudaFree(d_c);free(a);free(b);free(c);return 0;
}

思考:

1 VecAdd 被执行几次?

2 怎么被调用的?

3 有多少个线程在执行?线程间数据相互影响吗?

相关文章:

  • 前端基础入门三大核心之HTML篇:探索WebAssembly —— 开启网页高性能应用新时代
  • 成都爱尔胡建斌院长提醒近视超过600度,记得每年检查眼底!
  • excel转pdf并且加水印,利用ByteArrayOutputStream内存流不产生中间文件
  • attributes.nodeName和attributes.nodeValue有什么区别(代码举例说明)
  • rust的版本问题,安装问题,下载问题
  • SpringCloud微服务调用的超时机制和CompletableFuture异步调用的超时机制原理一样吗?
  • 【Linux】-Elasticsearch安装部署[16]
  • 12、Go Gin使用JWT实现认证机制
  • 晶体振荡器
  • go routing 之 gorilla/mux
  • Flutter 中的 AnimatedPhysicalModel 小部件:全面指南
  • 设计模式 15 Decorator Pattern 装饰器模式
  • 【LeetCode算法】第69题:x的平方根
  • linux mail命令及其历史
  • 免费开源人脸识别系统,支持RESTful API
  • [译] 怎样写一个基础的编译器
  • CSS居中完全指南——构建CSS居中决策树
  • Facebook AccountKit 接入的坑点
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Redash本地开发环境搭建
  • Web Storage相关
  • 基于遗传算法的优化问题求解
  • 聚簇索引和非聚簇索引
  • 前端js -- this指向总结。
  • 三分钟教你同步 Visual Studio Code 设置
  • 小程序测试方案初探
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • #QT(TCP网络编程-服务端)
  • (1)bark-ml
  • (LeetCode) T14. Longest Common Prefix
  • (转)JAVA中的堆栈
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • ******之网络***——物理***
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core 中的路径问题
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .Net8 Blazor 尝鲜
  • .NET开发不可不知、不可不用的辅助类(一)
  • /proc/vmstat 详解
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @Pointcut 使用
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [C++] sqlite3_get_table 的使用
  • [C++]使用yolov10的onnx模型结合onnxruntime和bytetrack实现目标追踪
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽
  • [delphi]保证程序只运行一个实例
  • [GN] 后端接口已经写好 初次布局前端需要的操作(例)
  • [I2C]I2C通信协议详解(二) --- I2C时序及规格指引
  • [iOS开发]iOS中TabBar中间按钮凸起的实现