Да, вы можете. Вы можете указать, что первый поток в блоке устанавливает его, а другой нет, например .:
extern __shared__ unsigned int local_bin[]; // Size specified in kernel call
if (threadIdx.x == 0) // Wipe on first thread - include " && threadIdx.y == 0" and " && threadIdx.z == 0" if threadblock has 2 or 3 dimensions instead of 1.
{
// For-loop to set all local_bin array indexes to specified value here - note you cannot use cudaMemset as it translates to a kernel call itself
}
// Do stuff unrelated to local_bin here
__syncthreads(); // To make sure the memset above has completed before other threads start writing values to local_bin.
// Do stuff to local_bin here
В идеале вы должны выполнить как можно больше работы перед вызовом syncthreads, поскольку это позволяет всем другим потокам выполнять свою работу до завершения memset - очевидно, это имеет значение только в том случае, если работа потенциально может иметь совершенно другой поток время завершения, например, если есть условное ветвление.
Обратите внимание, что для цикла «установка» для потока 0 необходимо передать размер массива local_bin в качестве параметра ядру, чтобы вы знали размер итерируемого массива.
Источник оригинальной концепции