首页 > 其他 > 详细

[CUDA]共享内存

时间:2015-12-13 02:29:52      阅读:326      评论:0      收藏:0      [点我收藏+]

? ? 对于GPU上启动的每个线程块上的共享内存,CUDA C编译器都会创建该变量的一个副本。同一线程块的每个线程都共享这块内存,但是线程无法看到也不能修改其他线程块中的共享内存。这样做可以使得一个线程块中的多个线程能够在计算上通信和协作。

? ? 共享内存缓冲区驻留在物理GUP上,因此访问共享内存的延迟远远低于访问普通缓冲区的延迟。

? ? 共享内存的声明方式是在前面加上 ?__shared__

? ? 为了保持进程同步,可以使用cuda的函数__syncthreads();。这个函数的作用是为了确保线程块的每个线程都执行完__syncthreads();之前的语句后,才会执行下面的语句。

?

? ? 出于易于理解,写了一个简单的程序,大致功能就是对于一列数,每四个数字进行逆转位置

?1 2 3 4 5 6 7 8 ?----》 4 3 2 1 8 7 6 5

#include<cuda_runtime.h>
#include<windows.h>
#include<iostream>
using namespace std;
const int nMax = 50;
__global__ void exchangeKernel(float *aaa)
{
	int offset = threadIdx.x + blockDim.x * blockIdx.x;
	int x = threadIdx.x;
	__shared__ float tmp[4];
	int a = offset / 4;
	a = (a + 1) * 4 - (offset - a * 4) - 1; ///a为同一个block对应位置的offset
	tmp[x] = aaa[a];

	__syncthreads();
	aaa[offset] = tmp[x];
}

int main(){
	float a[nMax];
	float *devA;
	for (int i = 0; i < nMax; i++){
		a[i] = i;
	}
	cudaMalloc((void**)&devA, nMax*sizeof(float));

	cudaMemcpy(devA, a, nMax*sizeof(float), cudaMemcpyHostToDevice);

	exchangeKernel << <10, 4 >> >(devA );

	cudaMemcpy(a, devA, nMax*sizeof(float), cudaMemcpyDeviceToHost);


	for (int i = 0; i < 40; i++){
		cout << a[i] << " ";
	}cout << endl;
	cudaFree(devA);
	cin >> a[0];
	return 0;
}

?

[CUDA]共享内存

原文:http://bbezxcy.iteye.com/blog/2263649

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!