《cuda c编程权威指南》04 - 使用块和线程索引映射矩阵索引

这篇具有很好参考价值的文章主要介绍了《cuda c编程权威指南》04 - 使用块和线程索引映射矩阵索引。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 解决的问题

2. 分析

3. 方法

4. 代码示例


1. 解决的问题

利用块和线程索引,从全局内存中访问指定的数据。

2. 分析

通常情况下,矩阵是用行优先的方法在全局内存中线性存储的。如下。

《cuda c编程权威指南》04 - 使用块和线程索引映射矩阵索引,cuda,cuda

8列6行矩阵(nx,ny)=(8,6)。

3. 方法

这里建立二维网格(2,3)+二维块(4,2)为例,使用其块和线程索引映射矩阵索引。

《cuda c编程权威指南》04 - 使用块和线程索引映射矩阵索引,cuda,cuda

(1)第一步,可以用以下公式把线程和块索引映射到矩阵坐标上;

《cuda c编程权威指南》04 - 使用块和线程索引映射矩阵索引,cuda,cuda

(2)第二步,可以用以下公式把矩阵坐标映射到全局内存中的索引/存储单元上;

《cuda c编程权威指南》04 - 使用块和线程索引映射矩阵索引,cuda,cuda

比如要获取矩阵元素(col,row) = (2,4) ,其全局索引是34,映射到矩阵坐标上,

ix = 2 + 0*3=2; iy = 0 + 2*2=4. 然后再映射到全局内存idx = 4*8 + 2 = 34.

4. 代码示例

#include "cuda_runtime.h"
#include "device_launch_parameters.h"  // threadIdx

#include <stdio.h>    // io
#include <time.h>     // time_t
#include <stdlib.h>  // rand
#include <memory.h>  //memset


#define CHECK(call)                                   \
{                                                     \
    const cudaError_t error_code = call;              \
    if (error_code != cudaSuccess)                    \
    {                                                 \
        printf("CUDA Error:\n");                      \
        printf("    File:       %s\n", __FILE__);     \
        printf("    Line:       %d\n", __LINE__);     \
        printf("    Error code: %d\n", error_code);   \
        printf("    Error text: %s\n",                \
            cudaGetErrorString(error_code));          \
        exit(1);                                      \
    }                                                 \
}


void initiaInt(int* p, const int N)
{

	for (int i = 0; i < N; i++)
	{
		p[i] = i;
	}
}

/// <summary>
/// 
/// </summary>
/// <param name="c">全局内存中线性存储的二维矩阵</param>
/// <param name="nx">列</param>
/// <param name="ny"></param>
void printMatrix(int* c, const int nx, const int ny)
{
	int* ic = c;
	printf("\n matrix: [%d, %d] \n", nx, ny);
	for (int i = 0; i < ny; i++)
	{
		for (int j = 0; j < nx; j++)
		{
			int cur_ele = ic[i * nx + j];
			printf("%d ", cur_ele);
		}
		printf("\n");
	}
	printf("\n");
}

/// <summary>
/// 
/// </summary>
/// <param name="a">全局内存中是线性存储的</param>
/// <param name="nx">col</param>
/// <param name="ny"></param>
/// <returns></returns>
__global__ void printThreadIdx(int* a, const int nx, const int ny)
{
	// 矩阵行列
	int ix = threadIdx.x + blockIdx.x * blockDim.x;
	int iy = threadIdx.y + blockIdx.y * blockDim.y;  
	// 全局索引
	unsigned int idx = iy * nx + ix;  // 前面有iy行,每行有nx个数。
	printf("thread_idx (%d, %d) block_idx (%d, %d) coordinate (%d, %d) global index %d val %d\n",
		threadIdx.x, threadIdx.y, blockIdx.x, blockIdx.y, ix, iy, idx, a[idx]
	);
}


int main(void)
{
	// get device info
	int device = 0;
	cudaDeviceProp deviceProp;
	CHECK(cudaGetDeviceProperties(&deviceProp, device));
	printf("Using device: %d %s", device, deviceProp.name);  // 卡号0的显卡名称。
	CHECK(cudaSetDevice(device));  // 设置显卡号

	// set matrix dimension
	int nx = 8, ny =6, nxy = nx * ny;
	int nBytes = nxy * sizeof(int);

	// malloc host memory
	int* h_a;
	h_a = (int*)malloc(nBytes);

	// init data
	initiaInt(h_a, nxy);
	printMatrix(h_a, nx, ny);

	// malloc device memory
	int* d_Mat_a;
	cudaMalloc((void**)&d_Mat_a, nBytes);
	
	// transfer data from host to device
	cudaMemcpy(d_Mat_a, h_a, nBytes, cudaMemcpyHostToDevice);

	// config
	dim3 block(4, 2);  // 二维线程块(x,y)=(4,2)
	dim3 grid((nx+block.x-1) / block.x, (ny+block.y-1)/block.y); // 二维网格(2,3)
	// 直接nx/block.x = 8/4=2. (8+4-1)/4=2.
	
	// invoke kernel
	printThreadIdx << <grid, block >> > (d_Mat_a, nx, ny);
	cudaDeviceSynchronize();

	// free memory
	cudaFree(d_Mat_a);
	free(h_a);

	// reset device
	cudaDeviceReset();

	return 0;
}

可以看到,全局索引值就是矩阵中存储的值。 

《cuda c编程权威指南》04 - 使用块和线程索引映射矩阵索引,cuda,cuda文章来源地址https://www.toymoban.com/news/detail-622595.html

到了这里,关于《cuda c编程权威指南》04 - 使用块和线程索引映射矩阵索引的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • C++多线程编程实践:从基础到实例的全面指南

    进程是系统资源分配和调度的基本单位,也是程序的一次执行过程。线程是进程的一个执行单元,是操作系统调度的基本单位。 多线程程序在提高计算机系统的并发性和响应性方面有着极其重要的作用。它可以更好地利用计算机的多核和多处理器资源,在提高系统吞吐量的同

    2024年02月08日
    浏览(30)
  • Elasticsearch权威指南

    作者:禅与计算机程序设计艺术 Elasticsearch是一个基于Lucene构建的开源搜索引擎,它提供了一个分布式、高扩展性、可靠、快速、精准的全文检索解决方案。它的主要特点包括: 分布式架构:集群中每一个节点都存储数据并且可以同时被索引和搜索; RESTful API:Elasticsearch通过

    2024年02月07日
    浏览(32)
  • Zookeeper 权威指南

    作者:禅与计算机程序设计艺术 1997年,Apache发布了ZooKeeper项目,基于Google的Chubby论文,解决分布式协调服务问题。ZooKeeper是一种开源的分布式协调服务,它是一个高效且可靠的分布式数据管理框架。其目标就是构建一个简单而健壮的分布式数据管理系统。 ZooKeeper通过一组简

    2024年02月09日
    浏览(31)
  • kafka权威指南(阅读摘录)

    零复制 Kafka 使用零复制技术向客户端发送消息——也就是说,Kafka 直接把消息从文件(或者更确切地说是 Linux 文件系统缓存)里发送到网络通道,而不需要经过任何中间缓冲区。这是 Kafka 与其他大部分数据库系统不一样的地方,其他数据库在将数据发送给客户端之前会先把

    2024年02月14日
    浏览(27)
  • Elasticsearch 权威指南

    作者:禅与计算机程序设计艺术 Elasticsearch是一个开源分布式搜索引擎,它的目的是提供一个搜索引擎系统,能够实时地、高效地存储、搜索、分析海量数据。相对于传统数据库搜索引擎来说,Elasticsearch具有以下几个主要优点: 分布式特性:Elasticsearch可以横向扩展,支持P

    2024年02月11日
    浏览(34)
  • 《Kafka权威指南》读书笔记

    《Kafka权威指南》第一、三、四、六章,是重点。可以多看看。 kafka是一个发布与订阅消息系统 消息:kafka的数据单元称为\\\"消息\\\"。可以把消息看成是数据库中的一个\\\"数据行\\\"。 消息的key:为key生成一个一致性散列值(HashCode),然后使用散列值对主题分区数进行取模,为消息选

    2024年02月04日
    浏览(28)
  • 《JavaScript权威指南》读书笔记1

        服创要开始了,选题基本上都是关于ai的,之前写的项目没有和ai有关的,也没有学习过这方面的知识。现在我们组基本上确认的选题是:【A01】基于文心大模型的智能阅卷平台设计与开发【百度】【A01】基于文心大模型的智能阅卷平台设计与开发【百度】,我们的实力面

    2024年01月25日
    浏览(34)
  • hadoop权威指南第四版

    1.1 面临的问题 存储越来越大,读写跟不上。 并行读多个磁盘。 问题1 磁盘损坏 – 备份数据HDFS 问题2 读取多个磁盘用于分析,数据容易出错 --MR 编程模型 1.2 衍生品 1 在线访问的组件是hbase 。一种使用hdfs底层存储的模型。支持单行的读写,对数据块读写也是不错的。 2 yar

    2024年02月08日
    浏览(28)
  • Docker 与 Kubernetes 权威指南

    作者:禅与计算机程序设计艺术 作为Docker火爆发展的一年里,Kubernetes带来了容器编排的革命性变化。Kubernetes整合了云原生计算的理念和开源社区的力量,真正成为企业级容器集群管理的事实标准。本书从Docker与Kubernetes的基础知识、安装部署配置三个方面全面剖析Docker及其周

    2024年02月05日
    浏览(39)
  • 理解 Web3 的权威指南

    作为开发者,无论是在新闻中、在办公室还是在与朋友交谈时,您一定听说过以下术语“web3”、“区块链”或“加密货币”。截至去年,围绕 web3 和加密货币领域有很多炒作。您可能想知道“是什么助长了所有这些炒作?”、“新技术会继续存在吗?”、“整个 web3 是关于什

    2024年01月20日
    浏览(26)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包