转自:GPU CUDA编程中threadIdx, blockIdx, blockDim, gridDim之间的区别与联系_TH_NUM的博客-CSDN博客

最重要的就是这张图:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"#include <stdio.h>
#include <stdlib.h>
#include <iostream>using namespace std;//thread 1D
__global__ void testThread1(int *c, const int *a, const int *b)
{int i = threadIdx.x;c[i] = b[i] - a[i];
}
//thread 2D
__global__ void testThread2(int *c, const int *a, const int *b)
{int i = threadIdx.x + threadIdx.y*blockDim.x;c[i] = b[i] - a[i];
}//thread 3D
__global__ void testThread3(int *c, const int *a, const int *b)
{int i = threadIdx.x + threadIdx.y*blockDim.x + threadIdx.z*blockDim.x*blockDim.y;c[i] = b[i] - a[i];
}//block 1D
__global__ void testBlock1(int *c, const int *a, const int *b)
{int i = blockIdx.x;c[i] = b[i] - a[i];
}//block 2D
__global__ void testBlock2(int *c, const int *a, const int *b)
{int i = blockIdx.x + blockIdx.y*gridDim.x;c[i] = b[i] - a[i];
}//block 3D
__global__ void testBlock3(int *c, const int *a, const int *b)
{int i = blockIdx.x + blockIdx.y*gridDim.x + blockIdx.z*gridDim.x*gridDim.y;c[i] = b[i] - a[i];
}//block-thread 1D-1D
__global__ void testBlockThread1(int *c, const int *a, const int *b)
{int i = threadIdx.x + blockDim.x*blockIdx.x;c[i] = b[i] - a[i];
}//block-thread 1D-2D
__global__ void testBlockThread2(int *c, const int *a, const int *b)
{int threadId_2D = threadIdx.x + threadIdx.y*blockDim.x;int i = threadId_2D+ (blockDim.x*blockDim.y)*blockIdx.x;c[i] = b[i] - a[i];
}//block-thread 1D-3D
__global__ void testBlockThread3(int *c, const int *a, const int *b)
{int threadId_3D = threadIdx.x + threadIdx.y*blockDim.x + threadIdx.z*blockDim.x*blockDim.y;int i = threadId_3D + (blockDim.x*blockDim.y*blockDim.z)*blockIdx.x;c[i] = b[i] - a[i];
}//block-thread 2D-1D
__global__ void testBlockThread4(int *c, const int *a, const int *b)
{int blockId_2D = blockIdx.x + blockIdx.y*gridDim.x;int i = threadIdx.x + blockDim.x*blockId_2D;c[i] = b[i] - a[i];
}//block-thread 3D-1D
__global__ void testBlockThread5(int *c, const int *a, const int *b)
{int blockId_3D = blockIdx.x + blockIdx.y*gridDim.x + blockIdx.z*gridDim.x*gridDim.y;int i = threadIdx.x + blockDim.x*blockId_3D;c[i] = b[i] - a[i];
}//block-thread 2D-2D
__global__ void testBlockThread6(int *c, const int *a, const int *b)
{int threadId_2D = threadIdx.x + threadIdx.y*blockDim.x;int blockId_2D = blockIdx.x + blockIdx.y*gridDim.x;int i = threadId_2D + (blockDim.x*blockDim.y)*blockId_2D;c[i] = b[i] - a[i];
}//block-thread 2D-3D
__global__ void testBlockThread7(int *c, const int *a, const int *b)
{int threadId_3D = threadIdx.x + threadIdx.y*blockDim.x + threadIdx.z*blockDim.x*blockDim.y;int blockId_2D = blockIdx.x + blockIdx.y*gridDim.x;int i = threadId_3D + (blockDim.x*blockDim.y*blockDim.z)*blockId_2D;c[i] = b[i] - a[i];
}//block-thread 3D-2D
__global__ void testBlockThread8(int *c, const int *a, const int *b)
{int threadId_2D = threadIdx.x + threadIdx.y*blockDim.x;int blockId_3D = blockIdx.x + blockIdx.y*gridDim.x + blockIdx.z*gridDim.x*gridDim.y;int i = threadId_2D + (blockDim.x*blockDim.y)*blockId_3D;c[i] = b[i] - a[i];
}//block-thread 3D-3D
__global__ void testBlockThread9(int *c, const int *a, const int *b)
{int threadId_3D = threadIdx.x + threadIdx.y*blockDim.x + threadIdx.z*blockDim.x*blockDim.y;int blockId_3D = blockIdx.x + blockIdx.y*gridDim.x + blockIdx.z*gridDim.x*gridDim.y;int i = threadId_3D + (blockDim.x*blockDim.y*blockDim.z)*blockId_3D;c[i] = b[i] - a[i];
}void addWithCuda(int *c, const int *a, const int *b, unsigned int size)
{int *dev_a = 0;int *dev_b = 0;int *dev_c = 0;cudaSetDevice(0);cudaMalloc((void**)&dev_c, size * sizeof(int));cudaMalloc((void**)&dev_a, size * sizeof(int));cudaMalloc((void**)&dev_b, size * sizeof(int));cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);testThread1<<<1, size>>>(dev_c, dev_a, dev_b);//testThread1<<<1, size>>>(dev_c, dev_a, dev_b);//uint3 s;s.x = size/5;s.y = 5;s.z = 1;//testThread2 <<<1,s>>>(dev_c, dev_a, dev_b);//uint3 s; s.x = size / 10; s.y = 5; s.z = 2;//testThread3<<<1, s >>>(dev_c, dev_a, dev_b);//testBlock1<<<size,1 >>>(dev_c, dev_a, dev_b);//uint3 s; s.x = size / 5; s.y = 5; s.z = 1;//testBlock2<<<s, 1 >>>(dev_c, dev_a, dev_b);//uint3 s; s.x = size / 10; s.y = 5; s.z = 2;//testBlock3<<<s, 1 >>>(dev_c, dev_a, dev_b);//testBlockThread1<<<size/10, 10>>>(dev_c, dev_a, dev_b);//uint3 s1; s1.x = size / 100; s1.y = 1; s1.z = 1;//uint3 s2; s2.x = 10; s2.y = 10; s2.z = 1;//testBlockThread2 << <s1, s2 >> >(dev_c, dev_a, dev_b);//uint3 s1; s1.x = size / 100; s1.y = 1; s1.z = 1;//uint3 s2; s2.x = 10; s2.y = 5; s2.z = 2;//testBlockThread3 << <s1, s2 >> >(dev_c, dev_a, dev_b);//uint3 s1; s1.x = 10; s1.y = 10; s1.z = 1;//uint3 s2; s2.x = size / 100; s2.y = 1; s2.z = 1;//testBlockThread4 << <s1, s2 >> >(dev_c, dev_a, dev_b);//uint3 s1; s1.x = 10; s1.y = 5; s1.z = 2;//uint3 s2; s2.x = size / 100; s2.y = 1; s2.z = 1;//testBlockThread5 << <s1, s2 >> >(dev_c, dev_a, dev_b);//uint3 s1; s1.x = size / 100; s1.y = 10; s1.z = 1;//uint3 s2; s2.x = 5; s2.y = 2; s2.z = 1;//testBlockThread6 << <s1, s2 >> >(dev_c, dev_a, dev_b);//uint3 s1; s1.x = size / 100; s1.y = 5; s1.z = 1;//uint3 s2; s2.x = 5; s2.y = 2; s2.z = 2;//testBlockThread7 << <s1, s2 >> >(dev_c, dev_a, dev_b);//uint3 s1; s1.x = 5; s1.y = 2; s1.z = 2;//uint3 s2; s2.x = size / 100; s2.y = 5; s2.z = 1;//testBlockThread8 <<<s1, s2 >>>(dev_c, dev_a, dev_b);//uint3 s1; s1.x = 5; s1.y = 2; s1.z = 2;//uint3 s2; s2.x = size / 200; s2.y = 5; s2.z = 2;//testBlockThread9<<<s1, s2 >>>(dev_c, dev_a, dev_b);cudaMemcpy(c, dev_c, size*sizeof(int), cudaMemcpyDeviceToHost);cudaFree(dev_a);cudaFree(dev_b);cudaFree(dev_c);cudaGetLastError();}
int main()
{const int n = 1000;int *a = new int[n];int *b = new int[n];int *c = new int[n];int *cc = new int[n];for (int i = 0; i < n; i++){a[i] = rand() % 100;b[i] = rand() % 100;c[i] = b[i] - a[i];}addWithCuda(cc, a, b, n);for (int i = 0; i < n; i++)printf("%d %d\n", c[i], cc[i]);delete[] a;delete[] b;delete[] c;delete[] cc; return 0;}

CUDA学习-计算实际线程ID相关推荐

  1. VS2017 CUDA编程学习8:线程同步-原子操作

    文章目录 前言 1. 原子操作的理解 2. C++ CUDA实现原子操作 3. 执行结果 总结 学习资料 VS2017 CUDA编程学习1:CUDA编程两变量加法运算 VS2017 CUDA编程学习2 ...

  2. CUDA学习笔记 —— (三)GPU计算性能与线程关系

    文章目录 概述 CPU运行 GPU运行单线程 GPU 1block 多线程运行 多block多线程 结果比对 概述 我们通过一个例子,相同的计算,我们分别在CPU,GPU单线程,GPU单block多线 ...

  3. CUDA学习笔记之程序优化

    CUDA学习笔记之程序优化 标签: cuda优化conflict存储算法数学计算 2010-01-05 17:18 5035人阅读 评论(4) 收藏 举报 分类: CUDA(6) 版权声明:本文为博主 ...

  4. 深度学习(三十六)异构计算CUDA学习笔记(1)

    异构计算CUDA学习笔记(1) 原文地址:http://blog.csdn.net/hjimce/article/details/51506207 作者:hjimce 近日因为感觉自己在深度学习工程化 ...

  5. CUDA学习(十):向量内积的多种方法实现

    博主CUDA学习系列汇总传送门(持续更新):编程语言|CUDA入门 文章目录 一.CPU上实现向量内积 二.GPU下单Block分散归约向量内积 三.单Block低线程归约向量内积 四.多block向 ...

  6. CUDA学习(三)之使用GPU进行两个数组相加

    传入两个数组,在GPU中将两个数组对应索引位置相加 #include "cuda_runtime.h" #include "device_launch_parameter ...

  7. CUDA学习----sp, sm, thread, block, grid, warp概念

    CUDA学习----sp, sm, thread, block, grid, warp概念 2017-01-11 17:14:28|  分类: HPC&CUDA优化 |  标签:cuda  g ...

  8. 广告深度学习计算:异构硬件加速实践

    丨目录: - 前沿 1. 算力需求与供给 1.1 算力需求:模型复杂度 1.2 算力供给:异构硬件计算能力 1.3 问题与优化方法 2. 算法-系统-硬件协同性能优化 2.1 算法优化 2.2 系统优 ...

  9. CUDA学习笔记(持续更新——蜗速)

    CUDA学习笔记(持续更新--蜗速) 1.CUDA 程序实现流程如下 2.内存管理 3.核函数 4.全局数据访问唯一索引 5.设备管理 附录代码 1.CUDA 程序实现流程如下 将数据从CPU内存拷贝 ...

最新文章

  1. Matlab Robotic Toolbox V9.10工具箱(三):轨迹规划
  2. encoding - 如何将 Dart 的ByteData转换为字符串?
  3. noj大作业c语言扫雷,noj大作业.doc
  4. C++经典书籍和相关内容
  5. 骨髓基质在正常和白血病个体中的细胞图谱|Cell最新(文末有彩蛋)
  6. TIOBE 9 月编程语言榜:Python 居然超越了 C++!
  7. 带你探索CPU调度的奥秘
  8. 小学生计算机按键分布图,人教版(新版)小学信息三下第2课《常用按键掌握牢》课件.ppt...
  9. Metrics-Java版的指标度量工具
  10. 中国移动创新系列丛书《OPhone应用开发权威指南》读者交流活动
  11. Java项目—在线考试系统
  12. Smartdrv程序有什么作用
  13. LCP 3. 机器人大冒险
  14. 无约束优化之单纯形法(Nelder-Mead Algorithm)
  15. 链塔智库|区块链产业要闻及动态周报(2021年8月第3周)
  16. 贪心算法_排队不等式_绝对值不等式_推公式
  17. JavaScript(一)——什么是JavaScript
  18. PE文件格式详解(7)
  19. 计算机设置用户权限的风险,电脑安全设置_当前安全设置会使计算机有风险怎么关掉...
  20. halo java_Halo - 轻快,简洁,功能强大,使用Spring Boot开发的博客系统

热门文章

  1. 关于MySQL count(distinct) 逻辑的另一个bug
  2. 2、cocos2d-js引擎的安装和新建
  3. TeeChart for .NET常用属性总结
  4. c/c++ 修改文件的创建时间,修改时间,访问时间 [和弦]
  5. scrapy基础知识之 parse()方法的工作机制思考:
  6. 线程状态以及sleep yield wait join方法
  7. Python全栈开发,Day1 - Python基础1
  8. PAT题解-1118. Birds in Forest (25)-(并查集模板题)
  9. 十、oracle 常用函数
  10. Single Number II(LintCode)