首页 > 编程语言 >利用规约算法实现求解数组元素最大值

利用规约算法实现求解数组元素最大值

时间:2024-03-13 23:04:09浏览次数:30  
标签:__ 规约 最大值 maxValue dev int 算法 maxIndex array

规约算法原理可参照上一篇关于规约算法求解数组和的博客,此处不再详细介绍,直接给出代码实现过程及注释。

#include <stdio.h>
#include <stdlib.h>

#define N 1000 // 数组大小

__global__ void findMax(int *array, int *maxValue, int *maxIndex) {
    __shared__ int s_maxValue;//保证每一个块在实现执行此函数时都会首先申请一块共享内存用来存储最大值
    __shared__ int s_maxIndex;//保证每一个块在实现执行此函数时都会首先申请一块共享内存用来存储最大值索引
    
    int tid = threadIdx.x;
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    
    // 初始化共享内存
    if (tid == 0) {
        s_maxValue = array[0];
        s_maxIndex = 0;
    }
    __syncthreads();
    
    // 在每个线程块内找到局部最大值及其索引(注意是线程块内部)
    for (int i = idx; i < N; i += blockDim.x * gridDim.x) {
        if (array[i] > s_maxValue) {
            s_maxValue = array[i];
            s_maxIndex = i;
        }
    }
    __syncthreads();
    
    // 由于块间共享内存的数据无法实现共享,因此此处需要将每个线程块的最大值和索引都写回全局内存
    if (tid == 0) {
        maxValue[blockIdx.x] = s_maxValue;
        maxIndex[blockIdx.x] = s_maxIndex;
    }
}

int main() {
    int array[N]; // 定义数组
    int *dev_array, *dev_maxValue, *dev_maxIndex; // 定义CUDA变量
    int maxValue[N / 256], maxIndex[N / 256]; // 存储每个线程块的最大值和索引

    // 在设备上分配内存
    cudaMalloc((void**)&dev_array, N * sizeof(int));
    cudaMalloc((void**)&dev_maxValue, (N / 256) * sizeof(int));
    cudaMalloc((void**)&dev_maxIndex, (N / 256) * sizeof(int));

    // 初始化数组
    for (int i = 0; i < N; i++) {
        array[i] = rand() % 1000; // 使用更大的范围生成随机数
    }

    // 将数组拷贝到设备
    cudaMemcpy(dev_array, array, N * sizeof(int), cudaMemcpyHostToDevice);

    // 调用内核函数
    findMax<<<N / 256, 256>>>(dev_array, dev_maxValue, dev_maxIndex);

    // 将结果从设备拷贝回主机
    cudaMemcpy(maxValue, dev_maxValue, (N / 256) * sizeof(int), cudaMemcpyDeviceToHost);
    cudaMemcpy(maxIndex, dev_maxIndex, (N / 256) * sizeof(int), cudaMemcpyDeviceToHost);

    // 在主机端找到全局最大值及其对应位置
    int globalMaxValue = -1, globalMaxIndex = -1;
    for (int i = 0; i < N / 256; i++) {
        if (maxValue[i] > globalMaxValue) {
            globalMaxValue = maxValue[i];
            globalMaxIndex = maxIndex[i];
        }
    }

    printf("数组最大值为: %d, 位于索引位置: %d\n", globalMaxValue, globalMaxIndex);

    // 释放设备上分配的内存
    cudaFree(dev_array);
    cudaFree(dev_maxValue);
    cudaFree(dev_maxIndex);

    return 0;
}

标签:__,规约,最大值,maxValue,dev,int,算法,maxIndex,array
From: https://blog.csdn.net/zy4213/article/details/136590142

相关文章

  • 在GPU上利用规约算法完成对数组元素累加的并行计算
    目录序言规约算法介绍GPU代码实现规约算法序言并行规约是一种适用于GPU平台的并行算法,主要提高求和、最值、均值、逻辑与和逻辑或等一类运算的并行度。若使用CPU计算,需要串行遍历所有元素得到上述运算的结果,但在GPU平台可以使用规约操作并行实现上述运算。规约算法介......
  • 反无人机电子护栏:原理、算法及简单实现
            随着无人机技术的快速发展,其在航拍、农业、物流等领域的应用日益广泛。然而,无人机的不规范使用也带来了安全隐患,如侵犯隐私、干扰航空秩序等。为了有效管理无人机,反无人机电子护栏技术应运而生。目录一、反无人机电子护栏基本原理二、使用的算法三、简单实......
  • Edu 12 --- Simple Subset -- 题解 (一个比较巧妙的思维算法题)
    SimpleSubset:题解:  思路解析:    题目要求任意两个数的和为质数,那我们最坏情况就是任意选择一个数,此时子集为最大。    如果子集中有两个奇数或者偶数,他们两个之和一定会被2整除,那么我们只能选择一奇一偶。    如果多个奇数都为1的话,他们两两......
  • 蓝桥杯算法训练VIP-数组查找及替换
    题目1634:蓝桥杯算法训练VIP-数组查找及替换时间限制:3s内存限制:192MB提交:1629解决:890题目描述给定某整数数组和某一整数b。要求删除数组中可以被b整除的所有元素,同时将该数组各元素按从小到大排序。如果数组元素数值在A到Z的ASCII之间,替换为对应字母。输......
  • 如何实现缓存与LRU算法以及惰性过期
    如何实现缓存与LRU算法以及惰性过期实现缓存概述与LRU算法详解缓存的基本概念与作用在计算机科学中,缓存是一种临时存储数据的技术,用于加速数据访问速度。通过将常用数据存储在高速缓存中,可以减少对慢速存储器(如磁盘或数据库)的访问次数,从而提高系统的性能和响应速度。缓存......
  • 基于广义正态分布算法改进的随机森林分类算法 - 附代码
    基于广义正态分布算法改进的随机森林分类算法-附代码文章目录基于广义正态分布算法改进的随机森林分类算法-附代码1.数据集2.RF模型3.基于广义正态分布算法优化的RF4.测试结果5.Matlab代码摘要:为了提高随机森林数据的分类预测准确率,对随机森林中的树木个数和最......
  • 基于人工蜂鸟算法改进的随机森林分类算法 - 附代码
    基于人工蜂鸟算法改进的随机森林分类算法-附代码文章目录基于人工蜂鸟算法改进的随机森林分类算法-附代码1.数据集2.RF模型3.基于人工蜂鸟算法优化的RF4.测试结果5.Matlab代码摘要:为了提高随机森林数据的分类预测准确率,对随机森林中的树木个数和最小叶子点数参......
  • 【蓝桥杯备赛】Day13:贪心算法(倒计时30天)
    题目1:题目3040:AnEasyProblem给定一个正整数N,求最小的、比N大的正整数M,使得M与N的二进制表示中有相同数目的1。举个例子,假如给定的N为78,其二进制表示为1001110,包含4个1,那么最小的比N大的并且二进制表示中只包含4个1的数是83,其二进制是1010011,因此83就是答案。输入格......
  • 点云算法--地面点提取
       地面点提取算法作为点云后处理算法中的核心一般有以下几类方法可以提取地面点:1.形态学或者渐进形态学  优点:效率较高。缺点:对于腐蚀膨胀过程中的参数设置需要基于先验知识,所以效果的稳定性很差,适合处理简单的场景。2.布料滤波  优点:地面点的准确率相对较高(但......
  • 选择、冒泡、插入排序——左神数据结构算法Day1学习笔记
    时间复杂度:算法的常数操作数量级的数学表达式中,去除常数的最高阶项,比如aN²+bN+c的时间复杂度就是O(N²)。时间复杂度是数据量大到一定程度时,评价算法优劣的指标。当时间复杂度相同时,分析不同数据样本下的实际运行时间来比较算法的优劣。额外空间复杂度:在执行代码过程中申请的......