博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CUDA学习(六)之使用共享内存(shared memory)进行归约求和(M个包含N个线程的线程块)...
阅读量:4359 次
发布时间:2019-06-07

本文共 1996 字,大约阅读时间需要 6 分钟。

在中介绍了使用一个包含N个线程的线程块和共享内存进行数组归约求和,

 基本思路:

  定义M个包含N个线程的线程块时(NThreadX = ((NX + ThreadX - 1) / ThreadX)),全局线程索引需使用tid = blockIdx.x * blockDim.x + threadIdx.x,而在每个线程块中局部线程索引是i = threadIdx.x,

每个线程块只计算一部分求和,求和结果保存在该线程块中的共享内存数组0号元素中,线程结束后将该值赋给对应全局数组(blockIdx.x * blockDim.x)元素中,最后在CPU端使用循环将每个线程块所求和相加,即得到最后结果。

代码如下:

#pragma once#include "cuda_runtime.h"#include "device_launch_parameters.h"#include "device_functions.h"#include 
using namespace std;const int NX = 10240; //数组长度const int ThreadX = 256; //线程块大小//使用shared memory和多个线程块__global__ void d_SharedMemoryTest(double *para){ int i = threadIdx.x; //该线程块中线程索引 int tid = blockIdx.x * blockDim.x + threadIdx.x; //M个包含N个线程的线程块中相对应全局内存数组的索引(全局线程) __shared__ double s_Para[ThreadX]; //定义固定长度(线程块长度)的共享内存数组 if (tid < NX) //判断全局线程小于整个数组长度NX,防止数组越界 s_Para[i] = para[tid]; //将对应全局内存数组中一段元素的值赋给共享内存数组 __syncthreads();  //(红色下波浪线提示由于VS不识别,不影响运行)同步,等待所有线程把自己负责的元素载入到共享内存再执行下面代码 for (int index = 1; index < blockDim.x; index *= 2) //归约求和 { __syncthreads(); if (i % (2 * index) == 0) { s_Para[i] += s_Para[i + index]; } } if (i == 0) //求和完成,总和保存在共享内存数组的0号元素中 para[blockIdx.x * blockDim.x + i] = s_Para[i]; //在每个线程块中,将共享内存数组的0号元素赋给全局内存数组的对应元素,即线程块索引*线程块维度+i(blockIdx.x * blockDim.x + i)}//使用shared memory和多个线程块void s_ParallelTest(){ double *Para; cudaMallocManaged((void **)&Para, sizeof(double) * NX); //统一内存寻址,CPU和GPU都可以使用 double ParaSum = 0; for (int i = 0; i
> > (Para); //调用核函数(M个包含N个线程的线程块) cudaDeviceSynchronize(); //同步 for (int i=0; i

 结果如下(CPU和GPU结果一致):

 

转载于:https://www.cnblogs.com/xiaoxiaoyibu/p/11403003.html

你可能感兴趣的文章
位(Bit)与字节(Byte)
查看>>
关于两次指针(struct型)传参数的问题
查看>>
在Logstash的配置文件中对日志事件进行区分
查看>>
字符串之strcmp
查看>>
Android使用Fragment程序崩溃
查看>>
codevs 2822 爱在心中(强连通分量)
查看>>
七:python 对象类型详解三:列表
查看>>
c语言基本数据类型相关
查看>>
SQL Server DATEADD() 函数
查看>>
makefile中的wildcard和patsubst
查看>>
F#基础教程 mutable关键字
查看>>
完全卸载MySQL数据库
查看>>
C#总结项目《影院售票系统》编写总结一
查看>>
Failed to stop iptables.service: Unit iptables.service not loaded.
查看>>
madpaly 移植到 TQ2440 遇到问题madplay not found (2)
查看>>
LISTVIEW显示JPEG缩略图
查看>>
YII中引用自定义类
查看>>
Unity 基础
查看>>
Python字符串切片操作知识详解
查看>>
利用python批量修改word文件名的方法示例
查看>>