If it was absolutely required for all the threads in a block to be at the same point in the code, do we require the __syncthreads function if the number of threads being launched is equal to the number of threads in a warp?
Note: No extra threads or blocks, just a single warp for the kernel.
Example code:
shared _voltatile_ sdata[16];
int index = some_number_between_0_and_15;
sdata[tid] = some_number;
output[tid] = x ^ y ^ z ^ sdata[index];
Updated with more information about using volatile
Presumably you want all threads to be at the same point since they are reading data written by other threads into shared memory, if you are launching a single warp (in each block) then you know that all threads are executing together. On the face of it this means you can omit the
__syncthreads(), a practice known as “warp-synchronous programming”. However, there are a few things to look out for.__syncthreads()acts as a barrier to this and therefore ensures that the data is written to shared memory before other threads read the data. Usingvolatilecauses the compiler to perform the memory write rather than keep in registers, however this has some risks and is more of a hack (meaning I don’t know how this will be affected in the future)__syncthreads()to conform with the CUDA Programming ModelwarpSizein device code (documented in the CUDA Programming Guide, under “built-in variables”, section B.4 in the 4.1 version)Note that some of the SDK samples (notably reduction and scan) use this warp-synchronous technique.