CUDA共享内存操作(__shared__关键字)

CUDA 对GPU的显存操作时,若线程频繁对某个数据进行读写操作,可以设置操作的数据常驻缓存,这样可以进一步提高代码的运行效率,并且同一个线程块内的所有线程共享该内存区域。然而当出现多个线程对同一个内存区域进行操作时,需要对线程进行同步操作,从而避免竞争的发生。cuda中使用__shared__关键字,这里使用__syncthreads()控制线程同步。

如核函数dot所示,代码生成一个数组并计算数组中所有元素的和,求和使用的是归约(Reduction)方法。

当所有启动的线程将第一个__syncthreads()之前的所有代码执行完毕时,所有线程再继续执行之后的代码,否则很可能在cache数组还未初始化完成就开始计算所有元素和,这样计算结果显然是错误的。

#include 

#define min(a, b) (a>>(dev_a, dev_b, dev_partial_c);

	//将数组 dev_partial_c 从 GPU 复制到 CPU
	cudaMemcpy(partial_c, dev_partial_c, blocksPerGrid * sizeof(float), cudaMemcpyDeviceToHost);

	//在CPU上完成最终的求和运算
	c = 0.0;
	for(int i = 0; i < blocksPerGrid; i++){
		c += partial_c[i];
	}

	printf("%s\n", "======================================");
	for(int i = 0; i < N; i++){
		printf("%f  %f \n", a[i], b[i]);
	}

	printf("c = %f \n", c);
	printf("blocksPerGrid %d \n", blocksPerGrid);

	// 释放 GPU 上的内存
	cudaFree(dev_a);
	cudaFree(dev_b);
	cudaFree(dev_partial_c);

	// 释放 CPU 上的内存
	free(a);
	free(b);
	free(partial_c);

	return 0;
}

你可能感兴趣的:(高性能计算)