首页 > 编程语言 >CUDA C++编程

CUDA C++编程

时间:2023-01-20 22:23:54浏览次数:47  
标签:元素 blockDim 编程 threadIdx C++ 索引 线程 CUDA blockIdx

核函数

作用

调用核函数的时候,代码会被N个CUDA线程执行N次。

 

修饰符

__global__ 返回值 函数名(){

  ...执行代码

}

 

调用

函数名<<<BlockNumber,ThreadNumber>>>();

BlockNumber是块的个数。

ThreadNumber是每一个块中的线程个数。

 

索引结构

块内线程的索引结构(threadIdx)

在一维,二维,三维的块中,threadIdx分别为一维索引,二维索引,三维索引。

threadIdx.x:一维索引

threadIdx.y:二维索引

threadIdx.z:三维索引

网内块的结构(blockIdx)

在一维,二维,三维的网中,blockIdx分别为一维索引,二维索引,三维索引。

blockIdx.x:一维索引

blockIdx.y:二维索引

blockIdx.z:三维索引

blockDim:块的大小(块内线程总数)

 

向量元素与线程之间映射

一维

blockIdx.x * blockDim.x + threadIdx.x

假设有Item0,Item1,Item2,Item3,Item4,Item5,Item6,Item7八个元素。有两个块block1,block2,每个块4个线程。则分配如下

Item0,Item1,Item2,Item3,分配给block1中的0,1,2,3号线程。

Item4,Item5,Item6,Item7,分配给block2中的0,1,2,3号线程。

则block2中的3号线程处理的元素,根据公式得:1*4+3=7,也就是Item7(索引下标从0开始)

三维

threadIdx.z * blockDim.y * blockDim.x + threadIdx.y * blockDim.x + threadIdx.x

 

网格大小与工作量匹配

匹配情况

每一个线程对应一个元素

不匹配

元素个数与线程总数不匹配,导致有的线程没有工作可干,运行时会出错。

解决方法

将任务总数N传递到核函数中。

网格内的线程,利用 threadIdx + blockIdx*blockDim检查自己是否超过元素总数N。

 

跨网格工作

通常一个线程不是处理一个元素,而是处理多个元素。

因此每次增长的步长为blockDim.x * gridDim.x(也就是一个网格的所有线程数)

此网格的块数GridDim.x为2,块中的线程数blockDim.x为4,所以一个网格的线程总数为2*4

案例

计算10000个元素,使用256个块,每个块32个线程,一轮可以处理8192个元素。那么在第二轮的时候,只需要判断i增加了后是否超过N即可,超过N的线程不执行。

__global__ void doubleElements(int *a, int N)
{
  int i;
  i = blockIdx.x * blockDim.x + threadIdx.x;
  int stride= blockDim.x * gridDim.x;
  for(;i<N;i+=stride){
   if (i < N)
      {
        a[i] *= 2;
      }
  }

 size_t threads_per_block = 256;
  size_t number_of_blocks = 32;
doubleElements<<<number_of_blocks, threads_per_block>>>(a, N);

 

标签:元素,blockDim,编程,threadIdx,C++,索引,线程,CUDA,blockIdx
From: https://www.cnblogs.com/RedNoseBo/p/17063325.html

相关文章

  • 史上最简单 OpenCV for C++ 在 Windows 和 Ubuntu 上编译安装使用教程
    准备工作原材料Ubuntu系统(非必须,Windows也可以,主要是Ubuntu适合编译)OpenCV3.4.1压缩包OpenCVcontrib3.4.1压缩包MinGW(Windows上运行GCC)版本信息......
  • 第一个CUDA程序
    测试代码编写“Test.cu”文件#include"iostream"#include"stdio.h"usingnamespacestd;__global__voidTestFunction(){printf("TheThread'Idis%d\n",......
  • Ubuntu环境下安装CUDA
    查看Nvidia显卡驱动信息nvidia-smi 下载对应版本的CUDAhttps://developer.nvidia.com/cuda-toolkit-archive  执行安装文件sudoshcuda_版本信息_linux.run......
  • 把KMP算法嚼碎了才利于消化!(C++)
    相信不少人在学数据结构的时候都被KMP算法搞的迷迷糊糊的,原理看的似懂非懂,代码写不出来,或者写出来了也不知道为什么就可以这么写。本文力求尽可能通俗详细的讲解KMP算法,让......
  • C++概述
    计算两个整数相加之和#include<iostream>usingnamespacestd;/*函数功能:计算两个整数相加之和*/intAdd(inta,intb){return(a+b);}//主函数intmai......
  • c++ namespace
    名字空间:名字空间有两个特征:1.顺序2.嵌套顺序:编译器和解释器相当于一个翻译官,拿着本子一行一行读代码,只有见过的名字才会记到本子上,每见过的名字他就不认识(所以C++需......
  • C#调用C++动态链接库dll之P/Invoke方式 — 1.无参无返回值函数调用
    1.新建一个C++空项目CPPTest2.新建一个PInvokeTest.cpp文件,并写下如下代码需要注意:下文中的两个函数名HelloWorld需要完全一致,只有这样才能确保被完全声明为一个其......
  • C++ Templates 中文版 电子书 pdf
    本书是C++模板编程的完全指南,旨在通过基本概念、常用技巧和应用实例3方面的有用资料,为读者打下C++模板知识的坚实基础。关注公众号:后厂村搬砖工。发送:电子书即可。......
  • C++ 基础语法2
    #include<iostream>usingnamespacestd;#include<string>#include<time.h>//结构体定义//structStudent//{//stringname;//intage;//intcount;//};//在结构体尾......
  • C++基础语法 3(面向对象、C++在执行过程当中4个区域、引用)
    #include<iostream>usingnamespacestd;//标注空间#include<string>#include<time.h>#include<cstdlib>//面向对象/*C++在执行过程当中4个区域:代码区:存放二进制代码,由操作......