CUDA Thread Indexing

1D grid of 1D blocks

__device__ int getGlobalIdx_1D_1D()
{
return blockIdx.x *blockDim.x + threadIdx.x;
}

1D grid of 2D blocks

__device__ int getGlobalIdx_1D_2D()
{
return blockIdx.x * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x;
}

1D grid of 3D blocks

__device__ int getGlobalIdx_1D_3D()
{
return blockIdx.x * blockDim.x * blockDim.y * blockDim.z
+ threadIdx.z * blockDim.y * blockDim.x + threadIdx.y * blockDim.x + threadIdx.x;
}

{
return blockIdx.x * blockDim.x * blockDim.y * blockDim.z
+ threadIdx.z * blockDim.y * blockDim.x + threadIdx.y * blockDim.x + threadIdx.x;
}

2D grid of 1D blocks

 __device__ int getGlobalIdx_2D_1D()
{
int blockId   = blockIdx.y * gridDim.x + blockIdx.x;
int threadId = blockId * blockDim.x + threadIdx.x;
return threadId;
}

{
int blockId   = blockIdx.y * gridDim.x + blockIdx.x;
int threadId = blockId * blockDim.x + threadIdx.x;
return threadId;
}

2D grid of 2D blocks  

__device__ int getGlobalIdx_2D_2D()
{
int blockId = blockIdx.x + blockIdx.y * gridDim.x;
int threadId = blockId * (blockDim.x * blockDim.y) + (threadIdx.y * blockDim.x) + threadIdx.x;
return threadId;
}

2D grid of 3D blocks

__device__ int getGlobalIdx_2D_3D()
{
int blockId = blockIdx.x
+ blockIdx.y * gridDim.x;
int threadId = blockId * (blockDim.x * blockDim.y * blockDim.z)
  + (threadIdx.z * (blockDim.x * blockDim.y))
  + (threadIdx.y * blockDim.x)
  + threadIdx.x;
return threadId;
}

3D grid of 1D blocks

__device__ int getGlobalIdx_3D_1D()
{
int blockId = blockIdx.x
+ blockIdx.y * gridDim.x
+ gridDim.x * gridDim.y * blockIdx.z;
int threadId = blockId * blockDim.x + threadIdx.x;
return threadId;
}

3D grid of 2D blocks

__device__ int getGlobalIdx_3D_2D()
{
int blockId = blockIdx.x
        + blockIdx.y * gridDim.x
+ gridDim.x * gridDim.y * blockIdx.z;
int threadId = blockId * (blockDim.x * blockDim.y)
 + (threadIdx.y * blockDim.x)
 + threadIdx.x;
return threadId;
}

3D grid of 3D blocks

__device__ int getGlobalIdx_3D_3D()
{
int blockId = blockIdx.x
+ blockIdx.y * gridDim.x
+ gridDim.x * gridDim.y * blockIdx.z;
int threadId = blockId * (blockDim.x * blockDim.y * blockDim.z)
 + (threadIdx.z * (blockDim.x * blockDim.y))
 + (threadIdx.y * blockDim.x)
 + threadIdx.x;
return threadId;
}

  

时间: 2024-12-12 15:35:05

CUDA Thread Indexing的相关文章

CUDA 计算线程索引的一般公式

CUDA thread index: int blockId = blockIdx.z * (gridDim.x*gridDim.y)                    + blockIdx.y * gridDim.x                    + blockIdx.x; int threadId = blockId * (blockDim.x * blockDim.y * blockDim.z)                      + threadIdx.z * (blo

CUDA 并行编程简介

前言 并行就是让计算中相同或不同阶段的各个处理同时进行.目前有很多种实现并行的手段,如多核处理器,分布式系统等.本专题的文章将主要介绍使用 GPU 实现并行的方法.参考本专题文章前请务必搭建好 CUDA 开发平台,搭建方法可以参考上一篇文章. GPU 并行的优缺点 优点: 1. 显存具有更大的内存带宽 2. GPU 具有更大量的执行单元 3. 价格低廉 缺点: 1. 对于不能高度并行化的工作,能带来帮助不大. 2. 对于绝大多数显卡型号,CUDA 仅支持 float 类型而不支持 double

CUDA系列学习(一)An Introduction to GPU and CUDA

本文从软硬件层面讲一下CUDA的结构,应用,逻辑和接口.分为以下章节: (一).GPU与CPU (二).CUDA硬件层面 (三).CUDA安装 (四).CUDA 结构与接口 4.1 Kernels 4.2 Thread,Block, Grid 4.3 Memory 4.4 Execution (五).码HelloWorld--数组求和 希望感兴趣的同学可以一起讨论. (一).GPU与CPU 对于浮点数操作能力,CPU与GPU的能力相差在GPU更适用于计算强度高,多并行的计算中.因此,GPU拥有更

Caffe 编译

Compilation Now that you have the prerequisites, edit your Makefile.config to change the paths for your setup The defaults should work, but uncomment the relevant lines if using Anaconda Python. cp Makefile.config.example Makefile.config # Adjust Mak

OpenCL OpenCL快速入门教程

OpenCL快速入门教程 原文地址:http://opencl.codeplex.com/wikipage?title=OpenCL%20Tutorials%20-%201 翻译日期:2012年6月4日星期一 这是第一篇真正的OpenCL教程.这篇文章不会从GPU结构的技术概念和性能指标入手.我们将会从OpenCL的基础API开始,使用一个小的kernel作为例子来讲解基本的计算管理. 首先我们需要明白的是,OpenCL程序是分成两部分的:一部分是在设备上执行的(对于我们,是GPU),另一部分是

CUDA __shared__ thread、block、grid之间的一维关系 (例子chapter5 dot点积(GPU高性能编程))

chapter5里重要的例子是dot,来解释一个block内多个thread的共享内存和同步. __shared__共享内存:“对于在GPU上启动的每个线程块,cuda c编译器都将创建该变量的一个副本.线程块中的每个线程都共享这块内存,并和其他线程块无关,这使一个线程块中多个线程能够在计算上进行通信和协作” __syncthreads():确保线程块中的每个线程都执行完__syncthreads()前面的语句后,在往下执行. 例子是Grid->一维Block->一维Thread: 通过实例代

cuda中thread id

1 //////////////////////////////////////////////////////////////////////////// 2 // 3 // Copyright 1993-2015 NVIDIA Corporation. All rights reserved. 4 // 5 // Please refer to the NVIDIA end user license agreement (EULA) associated 6 // with this sou

CUDA + DX10 注意:block内部thread矩阵的形式

今天用cuda block内thread的形式来修改 两个for循环的 六面体一直不对. // for (int i= 0;i<boxPointNums-1;i++)// { unsigned int j= threadIdx.x; unsigned int i= threadIdx.y; // for (int j = 0; j<boxPointNums-1;j++) { 是由于在计算vertex坐标时, i.j顺序的不正确会影响到坐标位置: boxVerticesCuda[gridInde

CUDA初试

1.基本概念 CUDA,全称是Compute Unified Device Architecture,意即统一计算架构,是NVIDIA推出的一种整合技术,开发者可以利用NVIDIA的GeForce 8 以后的GPU和较新的Quadro GPU进行计算. --维基百科 利用CUDA这个平台,可以方便地使用GPU来加速程序的数据运算.GPU对于深度学习这类领域非常重要,因为其具有强大的并行计算能力和浮点运算能力. CUDA的编程模型将CPU作为主机(Host),将GPU作为设备(Device),CP