智能建网站软件网上购物正品网站

张小明 2026/1/11 11:40:12
智能建网站软件,网上购物正品网站,本溪建设网站,叙述网站的建设意义所在向量加法是一个经典的并行计算示例#xff0c;非常适合作为学习 CUDA 的起点。任务是将两个等长向量 AAA 和 BBB 中的对应元素相加#xff0c;结果存储到向量 CCC 中#xff0c;即 C[i]A[i]B[i]C[i] A[i] B[i]C[i]A[i]B[i]。1. 核心概念回顾 在编写程序之前#xff0c;我…向量加法是一个经典的并行计算示例非常适合作为学习 CUDA 的起点。任务是将两个等长向量AAA和BBB中的对应元素相加结果存储到向量CCC中即C[i]A[i]B[i]C[i] A[i] B[i]C[i]A[i]B[i]。1. 核心概念回顾在编写程序之前我们需要明确 CUDA 中的两个核心角色角色描述编程环境主机 (Host)CPU 及其系统内存。负责程序的串行部分、内存分配和 Kernel 启动。标准 C/C 代码设备 (Device)NVIDIA GPU 及其板载内存。负责程序的并行部分Kernel 代码的执行。CUDA C/C 代码2. CUDA 向量加法程序结构一个完整的 CUDA 向量加法程序通常分为以下六个步骤主机初始化在 CPU 内存中分配和初始化输入数据AAA和BBB。设备内存分配在 GPU 全局内存中分配存储空间d_A,d_B,d_Cd\_A, d\_B, d\_Cd_A,d_B,d_C。数据传输H→\to→D将输入数据从主机内存h_A,h_Bh\_A, h\_Bh_A,h_B复制到设备内存d_A,d_Bd\_A, d\_Bd_A,d_B。内核启动与执行配置线程网格并在 GPU 上启动 Kernel 函数。数据传输D→\to→H将计算结果从设备内存d_Cd\_Cd_C复制回主机内存h_Ch\_Ch_C。资源清理释放主机和设备上分配的所有内存。3. CUDA C/C 代码实现我们将程序分为两个主要部分在 GPU 上执行的并行 Kernel 函数以及在 CPU 上执行的主机代码。3.1 Kernel 函数vectorAddKernel 函数是 CUDA 程序的并行核心用__global__修饰符声明。/** * brief 在设备 (GPU) 上执行的向量加法 Kernel 函数。 * * param A 输入向量 A (设备指针) * param B 输入向量 B (设备指针) * param C 输出向量 C A B (设备指针) * param N 向量长度 */ __global__ void vectorAdd(const float* A, const float* B, float* C, int N) { // 1. 计算当前线程的全局唯一索引 i // blockIdx.x: 当前线程块的索引 (从 0 到 GridDim.x - 1) // blockDim.x: 每个线程块的线程数量 // threadIdx.x: 当前线程在块内的索引 (从 0 到 BlockDim.x - 1) int i blockIdx.x * blockDim.x threadIdx.x; // 2. 边界检查确保线程索引不超过向量长度 N // 这样做是为了防止当 N 不是 blockDim.x 的整数倍时有额外的线程越界访问。 if (i N) { // 3. 执行核心计算并行地计算 C[i] A[i] B[i] C[i] A[i] B[i]; } }代码说明__global__标识符表示该函数是一个 Kernel从主机调用并在设备上执行。blockIdx.x和threadIdx.x内置变量用于标识当前线程在并行结构中的位置。通过简单的线性组合每个线程获得了它应该处理的元素iii的唯一索引。并行性假设N10000N10000N10000如果启动了100001000010000个线程那么100001000010000个C[i]C[i]C[i]的计算将同时或并发地在 GPU 的数千个核心上执行。3.2 主机代码main函数主机代码负责设置环境、调用 Kernel 并进行验证。#include iostream #include vector #include cmath // For std::abs // 假设 vectorAdd Kernel 定义在上文或其他地方 // __global__ void vectorAdd(const float* A, const float* B, float* C, int N); void runVectorAddition() { // 定义向量大小 const int N 1000000; const size_t bytes N * sizeof(float); // --- 1. 主机初始化 --- // 在主机 (CPU) 内存上分配和初始化向量 std::vectorfloat h_A(N); std::vectorfloat h_B(N); std::vectorfloat h_C(N); // 存储 GPU 结果 std::vectorfloat h_ref(N); // 存储 CPU 参考结果 // 初始化输入数据 for (int i 0; i N; i) { h_A[i] (float)i; h_B[i] (float)(i * 2); } std::cout 初始化数据完成。向量长度 N N std::endl; // --- 2. 设备内存分配 --- float *d_A, *d_B, *d_C; // 设备指针 // cudaMalloc 函数用于在 GPU 全局内存中分配内存 if (cudaMalloc((void**)d_A, bytes) ! cudaSuccess) exit(EXIT_FAILURE); if (cudaMalloc((void**)d_B, bytes) ! cudaSuccess) exit(EXIT_FAILURE); if (cudaMalloc((void**)d_C, bytes) ! cudaSuccess) exit(EXIT_FAILURE); std::cout 设备内存分配完成。 std::endl; // --- 3. 数据传输 (H - D) --- // cudaMemcpy 函数用于在不同内存空间之间进行数据拷贝 cudaMemcpy(d_A, h_A.data(), bytes, cudaMemcpyHostToDevice); cudaMemcpy(d_B, h_B.data(), bytes, cudaMemcpyHostToDevice); std::cout 数据从主机传输到设备完成。 std::endl; // --- 4. 配置 Kernel 启动参数 --- // 线程配置是实现并行性的关键 const int threadsPerBlock 256; // 每个块 256 个线程 // 计算所需线程块的数量确保覆盖所有 N 个元素 const int numBlocks (N threadsPerBlock - 1) / threadsPerBlock; // --- 5. Kernel 启动与执行 --- // Kernel 启动语法function_nameGridDim, BlockDim(args...) std::cout 启动 KernelGrid size numBlocks , Block size threadsPerBlock std::endl; vectorAddnumBlocks, threadsPerBlock(d_A, d_B, d_C, N); // 检查是否有异步错误发生 cudaError_t err cudaGetLastError(); if (err ! cudaSuccess) { std::cerr Kernel 启动失败: cudaGetErrorString(err) std::endl; exit(EXIT_FAILURE); } // 等待设备完成所有计算 cudaDeviceSynchronize(); // --- 6. 数据传输 (D - H) --- // 将结果从设备内存 d_C 复制回主机内存 h_C cudaMemcpy(h_C.data(), d_C, bytes, cudaMemcpyDeviceToHost); std::cout 结果从设备传输回主机完成。 std::endl; // --- 7. 资源清理 --- cudaFree(d_A); cudaFree(d_B); cudaFree(d_C); std::cout 设备内存释放完成。 std::endl; // --- 8. 结果验证 --- // CPU 串行计算参考结果 for (int i 0; i N; i) { h_ref[i] h_A[i] h_B[i]; } // 比较 GPU 结果与 CPU 参考结果 int errors 0; for (int i 0; i N; i) { if (std::abs(h_C[i] - h_ref[i]) 1e-5) { errors; } } if (errors 0) { std::cout ✅ 结果验证成功CUDA 计算结果正确。 std::endl; } else { std::cout ❌ 结果验证失败发现 errors 个错误。 std::endl; } } int main() { runVectorAddition(); return 0; }4. 关键函数和调用对比函数/调用执行位置功能描述类似 CPU 操作__global__ void func(...)设备侧GPU定义并行执行的程序段Kernel。标准 C/C 函数定义cudaMalloc主机侧CPU在 GPU 全局内存中分配空间。malloc或newcudaMemcpy主机侧CPU在 Host 和 Device 内存之间复制数据。memcpy(但涉及跨设备传输)funcG, B(...)主机侧CPU启动 Kernel配置 Grid (G) 和 Block (B) 的维度。函数调用 (但它是异步的)cudaFree主机侧CPU释放 GPU 全局内存。free或deletecudaDeviceSynchronize主机侧CPU阻塞 CPU 执行直到所有 GPU 操作完成。-5. 编译与运行CUDA 程序需要使用 NVIDIA 提供的nvcc (NVIDIA CUDA Compiler)进行编译。编译流程将上述代码保存为vector_add.cu文件。在命令行中使用nvcc编译nvcc vector_add.cu -o vector_add运行可执行文件./vector_add这个向量加法程序简洁而完整地展示了 CUDA 异构编程模型的精髓CPU 管理资源和任务GPU 高度并行地执行计算。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

商城网站大全福州网站开发哪家比较好

Parsec虚拟显示驱动深度解析:从入门到精通的全方位指南 【免费下载链接】parsec-vdd ✨ Virtual super display, upto 4K 2160p240hz 😎 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd 你是否曾经遇到过这样的困扰:需要扩展…

张小明 2026/1/10 15:41:35 网站建设

哈尔滨网站设计哪家公司好如何制作app软件

Simple Icons 终极指南:轻松获取3000免费品牌SVG图标 【免费下载链接】simple-icons 项目地址: https://gitcode.com/gh_mirrors/sim/simple-icons 在当今数字化时代,一个优秀的开源SVG图标库能够为开发者节省大量时间和精力。Simple Icons正是这…

张小明 2026/1/6 7:59:33 网站建设

如何攻击php网站有什么做任务拿钱的网站

Ubuntu使用指南:资源、操作与问题解决 1. 资源推荐 在学习和使用Ubuntu的过程中,有不少实用的资源可供参考。 有两本名字相近的杂志,一本来自美国,另一本来自欧洲。对于想要阅读材料更具趣味性,同时获取实用技巧和娱乐内容的新手来说,欧洲版更合适;而美国版则主要面向…

张小明 2026/1/6 7:58:48 网站建设

网站建设有几种咸阳学校网站建设联系电话

NVIDIA显卡终极调优神器:解锁隐藏性能参数完整指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 想要让你的NVIDIA显卡发挥出超越官方预设的性能表现吗?NVIDIA Profile Inspec…

张小明 2026/1/3 22:08:30 网站建设

什么是网站原创文章那个网站可以做学历认证

3分钟搞定抖音视频下载:小白也能秒变收藏达人 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 还在为精彩抖音视频一闪而过而懊恼?douyin-downloader这款开源神器让你彻底告别"手…

张小明 2026/1/6 7:15:11 网站建设

备案 网站负责人怎么建立网站 个人热点

我的小爱音箱AI升级体验:从智障到智能的完美蜕变 【免费下载链接】mi-gpt 🏠 将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 作为一名智能家居爱好者&#xff0c…

张小明 2026/1/6 7:15:28 网站建设