別の方法を指摘すると、 に
相当するインライン アセンブリを使用することもできます__syncthreads()
。これにより、計算機能 2.0 以降で使用できる参加スレッドの数にオプションの引数を使用できます。このようなものが動作するはずです:
#define __syncthreads_active(active_threads) asm volatile("bar.sync 0, %0;" :: "r"(active_threads));
if(threadIdx.x >= NTHREADS/2) return;
int active_warps = (NTHREADS/2 + warpSize) / warpSize;
int active_threads = active_warps * warpSize; // hopefully the compiler will optimize this to a simple active_threads = (NTHREADS/2 + warpSize) & ~32
__syncthreads_active(active_threads);
// do some work...
__syncthreads_active(active_threads);
// do some more work...
__syncthreads_active(active_threads);
免責事項: ブラウザで記述され、完全にテストされていません!
しかし、それが苦労する価値があるかどうかは別の問題です.