__threadfence意味着__syncthreads的效果?

时间:2016-06-08 13:10:32

标签: parallel-processing cuda synchronization reduction

我正在实施CUDA的并行缩减。

内核有<?php session_save_path('/home/sarahmanchester/session'); session_start(); if(!isset($_SESSION['activitylog'])){ $_SESSION['username'] = 'Admin'; $_SESSION['password'] = 'pass'; } $DisplayForm = True; if(isset($_POST['username']) && ($_POST['password'])){ if(($_SESSION['username'] == $_POST['username']) && ($_SESSION['password'] == $_POST['password'])){ echo 'Logged in!'; echo '<BR>'; echo 'Protected content will be displayed here.'; echo '<BR>'; echo '<input type="Submit" name="Submit" value="Logout">'; $DisplayForm = False; echo '<HR>'; } else{ echo 'Error: Incorrect password.'; } } if ($DisplayForm){ echo '<form method="POST" action="'.$_SERVER['sample800.php'].'">'; echo '<h1>Login demo</h1>'; echo '<BR>'; echo 'Username: '; echo '<input type="username" name="username">'; echo '<BR>'; echo 'Password: '; echo '<input type="password" name="password">'; echo '<BR>'; echo '<input type="Submit" name="Submit" value="Login">'; echo '</form>'; } ?> 等待所有线程完成共享内存的2次读取,然后将总和写回共享内存。

我是否应该使用__syncthreads来确保对下一次迭代的所有线程都可以看到对共享内存的写入,或者使用NVIDIA's example中给出的__threadfence_block

1 个答案:

答案 0 :(得分:4)

__syncthreads()也意味着内存栅栏功能。这包含在documentation

  

等待,直到线程块中的所有线程都到达这一点,并且__syncthreads()之前这些线程所做的所有全局和共享内存访问对块中的所有线程都是可见的。

因此,在这种情况下,除了__threadfence_block()

之外,没有必要使用__syncthreads()

在通常的一般并行缩减中,不能用threadfence函数替换执行障碍。除内存防护功能外,还需要执行障碍(__syncthreads())。在一般情况下,通常需要等待所有线程执行给定的一轮减少,然后再进行下一轮; __threadfence_block()本身不会强迫warp等待其他warp执行给定的一轮减少。

因此,__syncthreads()通常是必需的,假设您已正确使用__threadfence_block(),则通常不需要__syncthreads()

__threadfence_block()暗示__threadfence_block()

__syncthreads()并不意味着'$(ESCAPE_SQUOTE(JOBID))'