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