Cudaprimefaces能改变旗子

我有一个这样做的一些序列代码

if( ! variable ) { do some initialization here variable = true; } 

我明白,这在串行工作完美,只会被执行一次。 在CUDA中,什么primefaces操作才是正确的?

它看起来像你想要的是你的代码中的“关键部分”。 关键部分允许一个线程执行一系列指令,同时阻止任何其他线程或线程块执行这些指令。

例如,可以使用关键部分来控制对存储区域的访问,从而允许通过单个线程对该区域进行无冲突的访问。

primefaces本身只能用于一个非常有限的,基本上单一的操作,在一个单一的variables。 但是primefaces可以用来构build一个关键部分。

您应该在内核中使用以下代码来控制对关键部分的线程访问:

 __syncthreads(); if (threadIdx.x == 0) acquire_semaphore(&sem); __syncthreads(); //begin critical section // ... your critical section code goes here //end critical section __syncthreads(); if (threadIdx.x == 0) release_semaphore(&sem); __syncthreads(); 

在内核之前定义这些辅助函数和设备variables:

 __device__ volatile int sem = 0; __device__ void acquire_semaphore(volatile int *lock){ while (atomicCAS((int *)lock, 0, 1) != 0); } __device__ void release_semaphore(volatile int *lock){ *lock = 0; __threadfence(); } 

我已经testing并成功使用了上面的代码。 请注意,它基本上是在每个线程块中使用线程0作为请求者的线程块之间进行仲裁。 如果只想获得线程块中的一个线程执行关键部分代码,则应进一步调整(例如, if (threadIdx.x < ...) )您的关键部分代码。

在一个信号量的经线仲裁中有多个线程会带来额外的复杂性,所以我不推荐这种方法。 相反,让每个线程都像我在这里显示的那样进行仲裁,然后使用普通的线程块通信/同步方法(例如__syncthreads() ,共享内存等)来控制在获胜线程块内的行为。

请注意,这种方法将会对性能造成代价。 当你不知道如何以其他方式并行化你的algorithm时,你应该只使用关键部分。

最后,一个警告的话。 与任何线程并行架构一样,不恰当地使用关键部分可能导致死锁。 尤其是,对线程块内的线程块和/或线程的执行顺序进行假设是一个有缺陷的方法。