【笔记】cuda大师班7-11 索引

这篇具有很好参考价值的文章主要介绍了【笔记】cuda大师班7-11 索引。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. block,grid 的 idx & dim

注意区分threadIdx,blockIdx

1.1 blockIdx

每一个线程在cuda运行时唯一初始化的blockIdx变量只取决于所属的坐标,blockIdx同样也是dim3类型
【笔记】cuda大师班7-11 索引

1.1. 对比blockIdx和threadIdx

【笔记】cuda大师班7-11 索引blockIdx只取决于当前block在grid中的位置

1.2 blockDim

【笔记】cuda大师班7-11 索引

1.3 gridDim

【笔记】cuda大师班7-11 索引
和 blockDim的区别主要是block和grid的区别:block是组成grid的较小单元

1.4代码展示

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>

__global__ void print_details()
{
	printf(
		"blockIdx.x : %d , blockIdx.y : %d,blockIdx.z : %d ,blockDim.x : %d , blockDim.y : %d,gridDim.x : %d , gridDim.y : %d \n",
		blockIdx.x, blockIdx.y, blockIdx.z, blockDim.x, blockDim.y, gridDim.x, gridDim.y
	);
}

int main()
{

	int nx, ny;
	nx = 16;
	ny = 16;
	dim3 block(8, 8);
	dim3 grid(nx / block.x, ny / block.y);
	print_details << <grid, block >> > ();

	cudaDeviceSynchronize();

	cudaDeviceReset();

	return 0;
}

blockDim,gridDim有着基本相同的值

二.使用内核访问一维block

2.1 只使用threadIdx

【笔记】cuda大师班7-11 索引
不是唯一指定,因此只会访问前四个

【笔记】cuda大师班7-11 索引

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>

__global__ void unique_idx_calc_threadIdx(int * input)
{
	int tid = threadIdx.x;
	printf("threadIdx : %d ,value: %d \n", tid, input[tid]);

}

int main()
{
	int arrary_size = 8;
	int arrary_byte_size = sizeof(int) * arrary_size;
	int h_data[] = { 1,34,56,54,23,67,93,30 };

	for (int i = 0; i < arrary_size; i++)
	{
		printf("%d ", h_data[i]);
	}
	printf("\n");

	//传递到数字指针
	int* d_data;
	cudaMalloc((void**)&d_data, arrary_byte_size);
	cudaMemcpy(d_data, h_data, arrary_byte_size, cudaMemcpyHostToDevice);
	//只会访问前一半数据
	dim3 block(4);
	dim3 grid(2);

	//访问全部数据
	//dim3 block(8);
	//dim3 grid(1);
	unique_idx_calc_threadIdx << <grid, block >> > (d_data);

	cudaDeviceSynchronize();

	cudaDeviceReset();

	return 0;
}


2.2 一维全局索引计算

因为每一个block,threadIdx都是从0开始按照相对位置进行初始化,因此需要一种方法唯一确定线程。
【笔记】cuda大师班7-11 索引

因此我们使用的方法是将threadIdx添加偏置量以便获得每一个线程的全局索引,即
【笔记】cuda大师班7-11 索引

__global__ void unique_gid_calculation(int* input)
{
	int tid = threadIdx.x;
	int offset = blockIdx.x * blockDim.x;
	printf("blockIdx.x : %d ,threadIdx : %d,threadgid : %d ,value: %d \n",blockIdx.x,threadIdx.x, tid+ offset, input[tid + offset]);

}

三.使用全局索引访问二维block

【笔记】cuda大师班7-11 索引
最终推得
【笔记】cuda大师班7-11 索引
【笔记】cuda大师班7-11 索引

__global__ void unique_gid_calculation_2d(int* input)
{
	int tid = threadIdx.x;
	int block_offset = blockIdx.x * blockDim.x;
	int row_offset = blockDim.x * gridDim.x * blockIdx.y;
	int gid = tid + row_offset+ block_offset;
	printf("blockIdx.x : %d ,blockIdx.y : %d, tid : %d,gid : %d ,value: %d \n", 
		blockIdx.x, blockIdx.y, tid , gid, input[gid]);

}

四.访问二维grid

比较推荐的计算全局索引的方式是在同一个线程块中的线程使用连续的地址或元素进行访问
【笔记】cuda大师班7-11 索引
基于上述:
1.tid :在自身block的相对位置
【笔记】cuda大师班7-11 索引
2. block offset :水平方向上的偏差量
【笔记】cuda大师班7-11 索引
3. row_offset:竖直方向上的偏移量
【笔记】cuda大师班7-11 索引文章来源地址https://www.toymoban.com/news/detail-430915.html

__global__ void unique_gid_calculation_2d_2d(int* input)
{
	int tid = blockDim.x * threadIdx.y + threadIdx.x;
	int num_threads_in_a_block = blockDim.x * blockDim.y;

	int block_offset = blockIdx.x * num_threads_in_a_block;

	int num_threads_in_a_row = num_threads_in_a_block * gridDim.x;

	int row_offset = num_threads_in_a_row * blockIdx.y;
	int gid = tid + row_offset + block_offset;
	printf("blockIdx.x : %d ,blockIdx.y : %d, tid : %d,gid : %d ,value: %d \n",
		blockIdx.x, blockIdx.y, tid, gid, input[gid]);

}

到了这里,关于【笔记】cuda大师班7-11 索引的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【cluster_block_exception】写操作elasticsearch索引报错

    今天线上elk的数据太多,服务器的空间不足了。所以打算删除一些没用用的数据。我是用下面的request: 但是出错了。 { _index: ‘’, _type: ‘type’, _id: ‘record id’, status: 403, error: { type: ‘cluster_block_exception’, reason: ‘blocked by: [FORBIDDEN/8/index write (api)];’ } } (都是比较简单的英

    2024年02月13日
    浏览(28)
  • 11月最新WIFI大师小程序源码/支持无限部署

      11月最新WIFI小程序 此程序市面上都是500-600左右 1:三级代理模式,可以设置分成腾讯流量主广告费收益 2:活码生成:可以在后台生成多个活码,打印后给代理去市场推广,商店老板微信扫码活码即可绑定自己的推广账户,从而计算收益分配 3:用户管理:可以对用户进行

    2024年02月13日
    浏览(28)
  • 一次线上mysql 调优 ,join 的调优,索引优化(Block Nested Loop)

    原因: 某接口调用十分缓慢,通过 Explain 发现是SQL问题 可以看到,在Join连接时,出现了BNL查询,BNL出现是因为,JOIN连接时 dr表也就是 domian_redemption 被驱动的表上没出现可用的索引。 个人解决方法: 在对应的连接字段上,既dr的orderCode字段,内表加上索引,再次执行Explai

    2024年02月05日
    浏览(40)
  • CBAM(Convolutional Block Attention Module)卷积注意力模块用法及代码实现

    CBAM( Convolutional Block Attention Module )是一种轻量级注意力模块的提出于2018年。CBAM包含CAM(Channel Attention Module)和SAM(Spartial Attention Module)两个子模块,分别在通道上和空间上添加注意力机制。这样不仅可以节约参数和计算力,而且保证了其能够做为即插即用的模块集成到现

    2024年02月11日
    浏览(23)
  • 一行代码解决PyTorch训练模型时突然出现的For debugging consider passing CUDA_LAUNCH_BLOCKING=1报错

    一、问题描述         今天在调试模型的代码,然后代码一直运行得好好地,就突然出现了一下的错误: RuntimeError: CUDA error: invalid device ordinal CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect. For debugging consider passing CUDA_LAUNCH_BLOCK

    2024年02月02日
    浏览(38)
  • Python,cuda安装步骤及注意事项

    1、安装驱动精灵,查看显卡是否能被识别,如果没有需要安装显卡驱动 2、安装CUDA11,其中cuda中自带了英伟达的显卡驱动。直接安装cuda11就可以。选择精简安装模式。 3、安装完成后将《cudnn-11.1-windows-x64-v8.0.5.39》中的文件覆盖到cuda的安装路径中。 找到软件安装目录,将上面

    2024年04月27日
    浏览(33)
  • 【多版本cuda自由切换】在ubuntu上安装多个版本的CUDA,并且可以随时切换cuda-11.3//cuda-11.8//cuda-11.6//cuda-11.2

    问题描述         项目开发中,不同的项目可能对不同的cuda版本有所要求,常见的是这几种cuda-11.3//cuda-11.8//cuda-11.6,按照之前的认知,一个主机只能安装一个版本的cuda,否则会引起环境混乱,知道cuda底层逻辑的人都知道这有多么扯蛋,对吧。         也正是因为受到这个

    2024年02月03日
    浏览(37)
  • 《cuda c编程权威指南》04 - 使用块和线程索引映射矩阵索引

    目录 1. 解决的问题 2. 分析 3. 方法 4. 代码示例 利用块和线程索引,从全局内存中访问指定的数据。 通常情况下, 矩阵 是用行优先的方法在 全局内存 中线性存储的。如下。 8列6行矩阵(nx,ny)=(8,6)。 这里建立二维网格(2,3)+二维块(4,2)为例,使用其块和线程索引映射矩阵

    2024年02月14日
    浏览(32)
  • MySQL 索引的优缺点及索引注意事项

    MySQL索引是数据库中用于加快数据检索速度的一种数据结构。它在数据库表中的列上创建一个索引,以便数据库可以更快地查找和访问数据。 优点: 快速检索:索引可以大大减少数据库查询的时间,特别是在大型表中。通过使用索引,数据库可以直接跳转到符合查询条件的数

    2024年02月15日
    浏览(33)
  • MYSQL的索引使用注意

    索引并不是时时都会生效的,比如以下几种情况,将导致索引失效  如果使用了联合索引,要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始, 并且不跳过索引中的列。如果跳跃某一列,索引将会部分失效( 后面的字段索引失效 ) 。查看tb_user 表所创建的索

    2024年02月09日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包