cuda求矩阵每一行最大值

2023-11-18

2、完成一个尺寸512*512的二维数组的每一行最大值的并行程序实现数据类型设置为float。需要完成4个版本。
(1) 不使用共享内存,只使用全局内存;采用具有分支发散的并行归约;

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <stdlib.h>
#define index 512
# define TILE_WIDTH 2

__global__ void  calcSum(float* AA, int Width)
{
	unsigned int tid = threadIdx.x;
	int Row = blockIdx.x * blockDim.x + threadIdx.x;
	for (unsigned int stride = 1;stride < blockDim.x; stride *= 2)
	{
		__syncthreads();
		if (tid % (2 * stride) == 0 && AA[Row + stride] > AA[Row])
				AA[Row] = AA[Row + stride];
	}
}

int main()
{
	cudaError_t cudaStatus = cudaSuccess;
	//初始化cpu矩阵
	int Ndim = 0, Pdim = 0, Width = 0;
	Ndim = Pdim = Width = index;
	int szA = Ndim * Pdim;
	float* A, * AA;
	A = (float*)malloc(szA * sizeof(float));
	int i;//初始化矩阵,可改为学号
	for (i = 0; i < szA; i++)
		A[i] = i+1;
	cudaStatus = cudaMalloc((void**)&AA, szA * sizeof(float));
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "cudaMalloc1 failed!");
	}
	cudaStatus = cudaMemcpy(AA, A, szA * sizeof(float), cudaMemcpyHostToDevice);
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "cudaMemcpy1 failed!");
	}
	dim3 dimGrid=index;
	dim3 dimBlock=index;
	calcSum << <dimGrid, dimBlock >> > (AA, Width);
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "calcSum failed!");
		return 1;
	}
	cudaStatus = cudaDeviceSynchronize();
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching addKernel!\n", cudaStatus);
	}
	// Copy output vector from GPU buffer to host memory.
	cudaStatus = cudaMemcpy(A, AA, szA * sizeof(float), cudaMemcpyDeviceToHost);
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "cudaMemcpy failed!");
	}
	//打印
	for (int i = 0; i < szA; i += Width)
		printf("The RoWmax is :%.1f\n", A[i]);
	printf("\nArray A:\n");
	for (i = 0; i < Ndim; i++) {
		for (int j = 0; j < Pdim; j++)
			printf("%.1f\t", A[i * Pdim + j]);
		printf("\n");
	}
	cudaFree(AA);
	free(A);
	return 0;
}

(2)不使用共享内存,只使用全局内存;采用无分支发散的并行归约;
注:与上题一样,只是核函数改变

__global__ void  calcSum(float* AA, int Width)
{
	unsigned int tid = threadIdx.x;
	int Row = blockIdx.x * blockDim.x + threadIdx.x;
	for (unsigned int stride = blockDim.x/2; stride > 0; stride >>= 1)
	{
		__syncthreads();
		if (tid < stride&& AA[Row + stride] > AA[Row])
				AA[Row] = AA[Row + stride];
	}
}

(2) 使用共享内存;采用具有分支发散的并行归约;

3)	#include "cuda_runtime.h"4)	#include "device_launch_parameters.h"5)	#include <stdio.h>6)	#include <stdlib.h>7)	#define index 5128)	# define TILE_WIDTH 29)	
(10)	__global__ void  calcSum(float* AA, int Width)11{12)		__shared__ float middleware[index];//申请共享内存存放,数据不是很大情况下,不分块,可以直接存放每一个块的一行数据13)		unsigned int tid = threadIdx.x;14int Row = blockIdx.x * blockDim.x + threadIdx.x;15)		middleware[tid] = AA[Row];16for (unsigned int stride = 1; stride < blockDim.x; stride *= 2)17{18__syncthreads();19if (tid % (2 * stride) == 0 && middleware[tid+ stride] > middleware[tid])20)				middleware[tid] = middleware[tid + stride];21}22if (tid == 0)AA[Row] = middleware[0];//最大值放在数组第一个元素中23}24)	
(25int main()26{27)		cudaError_t cudaStatus = cudaSuccess;28//初始化cpu矩阵29int Ndim = 0, Pdim = 0, Width = 0;30)		Ndim = Pdim = Width = index;31int szA = Ndim * Pdim;32float* A, * AA;33)		A = (float*)malloc(szA * sizeof(float));34int i;35**//初始化矩阵,可改为学号**36for (i = 0; i < szA; i++)37)			A[i] = i+1;38)		cudaStatus = cudaMalloc((void**)&AA, szA * sizeof(float));39if (cudaStatus != cudaSuccess) {40fprintf(stderr, "cudaMalloc1 failed!");41}42)		cudaStatus = cudaMemcpy(AA, A, szA * sizeof(float), cudaMemcpyHostToDevice);43if (cudaStatus != cudaSuccess) {44fprintf(stderr, "cudaMemcpy1 failed!");45}46)		dim3 dimGrid = index;47)		dim3 dimBlock = index;48)		calcSum << <dimGrid, dimBlock >> > (AA, Width);49if (cudaStatus != cudaSuccess) {50fprintf(stderr, "calcSum failed!");51return 1;52}53)		cudaStatus = cudaDeviceSynchronize();54if (cudaStatus != cudaSuccess) {55fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching addKernel!\n", cudaStatus);56}57// Copy output vector from GPU buffer to host memory.58)		cudaStatus = cudaMemcpy(A, AA, szA * sizeof(float), cudaMemcpyDeviceToHost);59if (cudaStatus != cudaSuccess) {60fprintf(stderr, "cudaMemcpy failed!");61}62//打印63for (int i = 0; i < szA; i += Width)64printf("The RoWmax is :%.1f\n", A[i]);65printf("\nArray A:\n");66for (i = 0; i < Ndim; i++) {67for (int j = 0; j < Pdim; j++)68printf("%.1f\t", A[i * Pdim + j]);69printf("\n");70}71cudaFree(AA);72free(A);73return 0;74}

(4)使用共享内存,采用无分支发散的并行归约;
注:核函数改变,截图如上

__global__ void  calcSum(float* AA, int Width)
{
	__shared__ float middleware[index];//申请共享内存存放,数据不是很大情况下,不分块,可以直接存放每一个块的一行数据
	unsigned int tid = threadIdx.x;
	int Row = blockIdx.x * blockDim.x + threadIdx.x;
	middleware[tid] = AA[Row];
	for (unsigned int stride = blockDim.x; stride > 0; stride >>= 1)
	{
		__syncthreads();
		if (tid < stride && middleware[tid + stride] > middleware[tid])
			middleware[tid] = middleware[tid + stride];
	}
	if (tid == 0)AA[Row] = middleware[0];//最大值放在数组第一个元素中
}

测试16*16时结果是否正确:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cuda求矩阵每一行最大值 的相关文章

随机推荐

  • Python3使用urllib访问网页

    介绍 改教程翻译自python官网的一篇文档 urllib request是一个用于访问URL 统一资源定位符 的Python模块 它以urlopen函数的形式提供了一个非常简单的接口 可以访问使用多种不同协议的URL 它也提供了一个稍微复
  • 通过Nginx(basic auth)实现Prometheus账号密码登录

    一 原因 因客户Red Hat 7 5服务器安装部署grafana无法添加prometheus数据源 以及无法修改初始密码 为确保环境访问安全 特别研究通过账号密码认证访问prometheus 搜索了很多资料 但都缺这缺那 所以我这里记录下
  • AppStore 提审时的“出口合规证明”处理

    对于加密的管理 Apple不比之前严格了 一般选 否 也能通故审核 每次提交审核的时候都会让确认是否使用了Apple以的加密算法 在窗口提示了我们可以看到 可以在Xcdoe的info plist文件中增加App Uses Non Exemp
  • 众多Android 开源项目推荐,给力工作给力学习

    FBReaderJ FBReaderJ用于Android平台的电子书阅读器 它支持多种电子书籍格式包括 oeb ePub和fb2 此外还支持直接读取zip tar和gzip等压缩文档 项目地址 http www fbreader org F
  • jFinal框架下controller接参

    一 表单参数 1 前端 contentType x www form urlencoded 2 apipost接口测试 3 controller接参 1 注解 getPara获取参数 2 注解 默认参数 若方法的参数名为注解名 则jFina
  • Python 基础知识

    进阶选手 Python 进阶知识 Aimin20210819的博客 关注VXG AIMIN2020 更多 目录 1 Python 是怎么理解 2 Python数据类型 四种数据类型
  • 在Firefox浏览器中导入Burp Suite证书

    在日常的渗透中 经常就是在浏览器用bp来抓包 在配置完浏览器的代理的时候就会涉及CA证书问题 在设置完代理后 再访问百度时 就会出现如下图的问题 第一步 导出证书 打开burp suite 找到 代理 Proxy 在选择 选项 Option
  • 指针加法:c = (int *) ((char *) c + 1)与 c=c+1 的区别

    示例代码 include
  • Qt通过QSttings类读取*.ini配置文件

    目录 ini文件 什么是ini文件 格式 需要的参数 需要了解的API 单例 单线程实例 多线程实例 设计一个读取ini文件的类 AppSettings类 ini文件 什么是ini文件 INI Initialization File 是微软
  • DTO和POJO实体类之间值映射

    package cn test util import java lang reflect Method import java util List public class AutoMapper public static
  • Git:Git中的远程操作和标签管理--分布式版本控制系统

    文章目录 理解分布式版本控制系统 克隆仓库 远程推送 拉取远程仓库 配置Git 标签管理 本篇主要总结关于Git中远程操作的相关事项 理解分布式版本控制系统 在进行远程操作前 首先要理解什么是分布式版本控制系统 理解这个问题时要思考这样的问
  • 从均值方差到有效前沿

    这篇文章的主要目的是介绍有效前沿这个理论工具和分析框架 我们由均值方差分析展开 逐步推演到有效前沿 然后 我们又说到有效前沿在投资或者量化中的应用场景 最后我们也总结了有效前沿的一些问题 尤其是敏感性问题 在教程中 特意加入了一些实验代码
  • 学习日记——物联网云平台组件(云消息的后续处理)

    百度云物联网组件图 设备通过MQTT等协议将数据上报到百度云平台 百度云通过主题来将设备分发给其他设备 并且可以通过规则引擎来将数据发送给时序数据库对象存储等等其他云服务 来实现我们想要的各种功能 规则引擎 一 规则引擎简介 使用规则引擎功
  • [qiankun]实战问题汇总

    qiankun 实战问题汇总 ERROR SyntaxError Cannot use import statement outside a module 问题分析 解决方案 子应用命名问题 问题分析 解决方案 jsonpFunction
  • 你的Siri收集了你的个人数据?联邦学习介绍

    MIT Technology Review Apple Siri 这是 MIT Technology Review 12月11日的 Newsletter 的部分摘录 大概意思是 iPhone 上的 Siri 在听到我们个人说 Hey Sir
  • 集群分布式quartz的需要的表

    集群分布式quartz的需要的表 集群分布式quartz一共需要的11张表 select from QRTZ FIRED TRIGGERS select from QRTZ PAUSED TRIGGER GRPS select from Q
  • NDK错(二)

    提示 No version of NDK matched the requested version 21 0 6113669 Versions available locally 22 1 7171670 23 0 7421159 方案一
  • 用执行计划看SQL的索引命中情况

    SQL Server查询超时 用执行计划看SQL的索引命中情况 从SQL Server查询语句 查询超时 需要优化 以下只优化方案之一 仅供参考 选中某段SQL后按CTRL L 查看执行计划 找出哪些表用了全局查询 选中某表按ALT F1
  • 数据结构(2)时间复杂度——渐进时间复杂度、渐进上界、渐进下界

    目录 2 1 概述 2 2 时间复杂度的计算 2 2 1 渐进复杂度 2 2 2 渐进上界 2 2 3 渐进下届 2 2 4 复杂度排序 2 2 5 举几个例子 2 1 概述 算法的基本定义 求解问题的一系列计算或者操作 衡量算法性能的指标
  • cuda求矩阵每一行最大值

    2 完成一个尺寸512 512的二维数组的每一行最大值的并行程序实现数据类型设置为float 需要完成4个版本 1 不使用共享内存 只使用全局内存 采用具有分支发散的并行归约 include cuda runtime h include d