Я предполагаю, что вы хотите что-то вроде этого:
int offset = (threadIdx.x == 33) ? threadIdx.x : 0;
int val = bases[threadIdx.x + offset];
так, чтобы последняя нить получает ненулевое смещение от индекса потока в пределах блока. Тернарный оператор будет оцениваться условно и не будет вызывать расхождения ветвей. Тем не менее, я предлагаю пересмотреть использование размера блока, который не кратен размеру основы (32). Таким образом, вы будете тратить много ядер и циклов. Не было бы ничего, что могло бы остановить использование блока с 32 потоками, а последние два потока выполняли бы дополнительные вычисления, например, для покрытия 34 операций на блок.
Он выглядит хорошо. Просто вопрос, 34-й поток будет тратить то же время на первой строке, что и другие 33, или мне нужно будет поместить __syncthreads()? @talonmies – elect
Нет, для этого вам не нужен барьер синхронизации. – talonmies