【cuda入门系列】通过代码真实打印线程ID

【cuda入门系列】通过代码真实打印线程ID

【cuda入门系列之参加CUDA线上训练营】在Jetson nano本地跑 hello cuda!
【cuda入门系列之参加CUDA线上训练营】一文认识cuda基本概念
【cuda入门系列之参加CUDA线上训练营】共享内存实例1:矩阵转置实现及其优化
【cuda入门系列之参加CUDA线上训练营】共享内存实例2:矩阵相乘
【cuda入门系列】通过代码真实打印线程ID

定义一个长度为24的向量,分别用gridDim(6,1),blockDim(4,1)以及gridDim(3,2),blockDim(2,2)的thread去访问,确认thread与向量各元素之间的对应关系。

1.gridDim(6,1),blockDim(4,1)

#include <stdio.h>
#define BLOCK_SIZE 4

__global__ void gpu_print(int *a,int m,int n)
{ 
    int row = blockIdx.y * blockDim.y + threadIdx.y; 
    int col = blockIdx.x * blockDim.x + threadIdx.x;
	printf("%d %d\n", gridDim.x,gridDim.y);    
	printf("%d %d\n", blockDim.x,blockDim.y);
	printf("blockIdx.y:%d blockIdx.x:%d threadIdx.y:%d threadIdx.x:%d val:%d \n", blockIdx.y,blockIdx.x,threadIdx.y,threadIdx.x,a[row*n+col]);	
}

int main(int argc, char const *argv[])
{
    int m=4;
    int n=6;

    int *h_a;
    cudaMallocHost((void **) &h_a, sizeof(int)*m*n);

    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < n; ++j) {
            h_a[i * n + j] = i * n + j;
        }
    }
    
    int *d_a;
    cudaMalloc((void **) &d_a, sizeof(int)*m*n);
    cudaMemcpy(d_a, h_a, sizeof(int)*m*n, cudaMemcpyHostToDevice);
    dim3 dimGrid(6,1);
    dim3 dimBlock(4,1);
	
    gpu_print<<<dimGrid, dimBlock>>>(d_a,m, n);    


    // free memory
    cudaFree(d_a);
    cudaFreeHost(h_a);
	
	system("pause");
    return 0;
}

编译后打印结果如下:

6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
6 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
4 1
blockIdx.y:0 blockIdx.x:1 threadIdx.y:0 threadIdx.x:0 val:4
blockIdx.y:0 blockIdx.x:1 threadIdx.y:0 threadIdx.x:1 val:5
blockIdx.y:0 blockIdx.x:1 threadIdx.y:0 threadIdx.x:2 val:6
blockIdx.y:0 blockIdx.x:1 threadIdx.y:0 threadIdx.x:3 val:7
blockIdx.y:0 blockIdx.x:3 threadIdx.y:0 threadIdx.x:0 val:12
blockIdx.y:0 blockIdx.x:3 threadIdx.y:0 threadIdx.x:1 val:13
blockIdx.y:0 blockIdx.x:3 threadIdx.y:0 threadIdx.x:2 val:14
blockIdx.y:0 blockIdx.x:3 threadIdx.y:0 threadIdx.x:3 val:15
blockIdx.y:0 blockIdx.x:2 threadIdx.y:0 threadIdx.x:0 val:8
blockIdx.y:0 blockIdx.x:2 threadIdx.y:0 threadIdx.x:1 val:9
blockIdx.y:0 blockIdx.x:2 threadIdx.y:0 threadIdx.x:2 val:10
blockIdx.y:0 blockIdx.x:2 threadIdx.y:0 threadIdx.x:3 val:11
blockIdx.y:0 blockIdx.x:4 threadIdx.y:0 threadIdx.x:0 val:16
blockIdx.y:0 blockIdx.x:4 threadIdx.y:0 threadIdx.x:1 val:17
blockIdx.y:0 blockIdx.x:4 threadIdx.y:0 threadIdx.x:2 val:18
blockIdx.y:0 blockIdx.x:4 threadIdx.y:0 threadIdx.x:3 val:19
blockIdx.y:0 blockIdx.x:0 threadIdx.y:0 threadIdx.x:0 val:0
blockIdx.y:0 blockIdx.x:0 threadIdx.y:0 threadIdx.x:1 val:1
blockIdx.y:0 blockIdx.x:0 threadIdx.y:0 threadIdx.x:2 val:2
blockIdx.y:0 blockIdx.x:0 threadIdx.y:0 threadIdx.x:3 val:3
blockIdx.y:0 blockIdx.x:5 threadIdx.y:0 threadIdx.x:0 val:20
blockIdx.y:0 blockIdx.x:5 threadIdx.y:0 threadIdx.x:1 val:21
blockIdx.y:0 blockIdx.x:5 threadIdx.y:0 threadIdx.x:2 val:22
blockIdx.y:0 blockIdx.x:5 threadIdx.y:0 threadIdx.x:3 val:23

从代码打印结果来看,一共有blcokDim4*gridDim 6=24个线程在工作。

  • gridDim.x,gridDim.y———grid中x方向、y方向各含有多少个block;
  • blockDim.x,blockDim.y——一个block中x方向、y方向各含有多少个thread。

定义的gridDim.x,gridDim.y以及blockDim.x,blockDim.y通过打印结果,可知:

在这里插入图片描述

各block中的thread与矩阵中元素的指向关系如下图:
在这里插入图片描述

2.gridDim(3,2),blockDim(2,2)

将代码中的

dim3 dimGrid(6,1);
dim3 dimBlock(4,1);

修改为:

dim3 dimGrid(3,2);
dim3 dimBlock(2,2);

其他不变,同样进行编译,打印输出:

3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
3 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
blockIdx.y:0 blockIdx.x:1 threadIdx.y:0 threadIdx.x:0 val:2
blockIdx.y:0 blockIdx.x:1 threadIdx.y:0 threadIdx.x:1 val:3
blockIdx.y:0 blockIdx.x:1 threadIdx.y:1 threadIdx.x:0 val:8
blockIdx.y:0 blockIdx.x:1 threadIdx.y:1 threadIdx.x:1 val:9
blockIdx.y:1 blockIdx.x:0 threadIdx.y:0 threadIdx.x:0 val:12
blockIdx.y:1 blockIdx.x:0 threadIdx.y:0 threadIdx.x:1 val:13
blockIdx.y:1 blockIdx.x:0 threadIdx.y:1 threadIdx.x:0 val:18
blockIdx.y:1 blockIdx.x:0 threadIdx.y:1 threadIdx.x:1 val:19
blockIdx.y:0 blockIdx.x:2 threadIdx.y:0 threadIdx.x:0 val:4
blockIdx.y:0 blockIdx.x:2 threadIdx.y:0 threadIdx.x:1 val:5
blockIdx.y:0 blockIdx.x:2 threadIdx.y:1 threadIdx.x:0 val:10
blockIdx.y:0 blockIdx.x:2 threadIdx.y:1 threadIdx.x:1 val:11
blockIdx.y:1 blockIdx.x:1 threadIdx.y:0 threadIdx.x:0 val:14
blockIdx.y:1 blockIdx.x:1 threadIdx.y:0 threadIdx.x:1 val:15
blockIdx.y:1 blockIdx.x:1 threadIdx.y:1 threadIdx.x:0 val:20
blockIdx.y:1 blockIdx.x:1 threadIdx.y:1 threadIdx.x:1 val:21
blockIdx.y:0 blockIdx.x:0 threadIdx.y:0 threadIdx.x:0 val:0
blockIdx.y:0 blockIdx.x:0 threadIdx.y:0 threadIdx.x:1 val:1
blockIdx.y:0 blockIdx.x:0 threadIdx.y:1 threadIdx.x:0 val:6
blockIdx.y:0 blockIdx.x:0 threadIdx.y:1 threadIdx.x:1 val:7
blockIdx.y:1 blockIdx.x:2 threadIdx.y:0 threadIdx.x:0 val:16
blockIdx.y:1 blockIdx.x:2 threadIdx.y:0 threadIdx.x:1 val:17
blockIdx.y:1 blockIdx.x:2 threadIdx.y:1 threadIdx.x:0 val:22
blockIdx.y:1 blockIdx.x:2 threadIdx.y:1 threadIdx.x:1 val:23

在这里插入图片描述
貌似是先切割y方向,比如此例子中,gridDim.yblockDim.y=22=4,所以将24个元素平分成了4份;然后再在x方向分割。最后组装,由各block中的thread访问。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
CUDA(Compute Unified Device Architecture)是NVIDIA推出的并行计算平台和API模型,用于利用GPU的计算能力。以下是一个CUDA快速入门代码的示例: 代码示例: #include <cuda_runtime.h> #include <stdio.h> // CUDA核函数,执行在GPU上 __global__ void cudaHelloWorld() { printf("Hello World from GPU!\n"); } int main() { // 调用CUDA异步执行的配置 cudaStream_t stream; cudaStreamCreate(&stream); // 定义核函数的执行配置 dim3 block(1, 1); dim3 grid(1, 1); // 在GPU上调用核函数 cudaHelloWorld<<<grid, block, 0, stream>>>(); // 同步GPU,等待核函数执行完成 cudaStreamSynchronize(stream); // 销毁CUDAcudaStreamDestroy(stream); // 输出CPU上的信息 printf("Hello World from CPU!\n"); return 0; } 该示例代码中,我们在主函数中调用CUDA核函数cudaHelloWorld,并在GPU上并行执行。核函数使用__global__修饰符标记,表明它将在GPU上执行。在主函数中,我们首先使用cudaStreamCreate函数创建一个CUDA流,用于异步执行核函数。然后,我们定义了核函数的执行配置,即指定了需要启动的线程块数量和线程块中的线程数量。在调用核函数时,我们传递了执行配置、流对象和其他参数。接着,我们使用cudaStreamSynchronize函数来等待GPU上的核函数执行完成,以确保输出的正确顺序。最后,我们使用printf函数输出来自CPU和GPU的信息。 这个示例代码展示了如何使用CUDA快速入门,并在GPU上进行并行计算。通过学习和掌握CUDA编程,开发者可以充分利用GPU的并行计算能力,加速各种科学计算和计算密集型任务的执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

外卖猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值