CUDA实现inter-block间同步——基于锁的块间同步

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>

#define BLOCK_NUM 5
#define THREAD_NUM 32

__device__ volatile int g_mutex;

__global__ void gpu_sync(int goalVal)
{
	int tid = blockIdx.x *blockDim.x + threadIdx.x;

	for (int loop = 0; loop < 10; loop++)
	{
		if (tid % 3 == 0)
		{
			int x = 52;
			int y = 10;
			int z = x * y;
			int k = x % y;
			int l = x ^ y;
		}
		printf("%d(loop#):%d(BLOCK#)%d(TREADZ#)\n", loop, blockIdx.x, threadIdx.x);
		if (threadIdx.x == 0)
		{
			atomicAdd((int*)&g_mutex, 1);

			// only when all blocks add 1 go g_mutex
			// will g_mutex equal to goalVal
			while (g_mutex != goalVal)
			{
				// Do nothing here
			}
		}
		__syncthreads();
		printf("Yeah!\n");
		if (threadIdx.x == 0)
		{
			atomicExch((int*)&g_mutex, 0);
		}
	}
}

__global__ void gpu_sync_nonlock(int goalVal)
{
	int tid = blockIdx.x *blockDim.x + threadIdx.x;

	for (int loop = 0; loop < 10; loop++)
	{
		if (tid%3==0)
		{
			int x = 52;
			int y = 10;
			int z = x * y;
			int k = x % y;
			int l = x ^ y;
		}
		printf("%d(loop#):%d(BLOCK#)%d(TREADZ#)\n", loop, blockIdx.x, threadIdx.x);
		__syncthreads();
		printf("Yeah!\n");
	}
}

int main()
{

	gpu_sync << <BLOCK_NUM, THREAD_NUM >> > (BLOCK_NUM);

    return 0;
}

__syncthreads只能实现intra-block间的同步:
请添加图片描述

CUDA 基于锁的同步的基本思想是使用一个全局互斥量变量来计算到达同步点的线程块的数量。如下代码所示,在 barrier 函数 __gpu_sync() 中,在一个块完成它的计算之后,它的一个线程 (这里人为设置为 0 号线程,我们称之为主导线程) 将自动地向 g_mutex 添加 1 (原子操作)。然后,主导线程将重复将 g_mutex 和一个目标值 goalVal 进行比较。如果 g_mutex 等于 goalVal,那么就意味着同步完成,即每个线程块都可以进行下一阶段的计算。在该设计中,当第一次调用 barrier 函数时,将 goalVal 设置为内核中的块数 N 。然后,当连续调用 barrier 函数时,goalVal的值每次递增 N 。这种设计比保持 goalVal 常量并在每个 barrier 之后重新设置 g_mutex 更有效,因为前者节省了指令的数量并避免了条件分支 。
参考链接
请添加图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老实人小李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值