2012-07-01 2 views
0

У меня есть разные блоки по 34 нити каждый (0 ... 33).Cuda thread: специальное сопоставление/индексирование

мне нужно найти формулу так, чтобы в каждом из этих блоков, первые 33 нитей (0 ... 32) будут указывать на корреспондент

bases[x] 

С й от 0 до 32, в то время как последний, 33, к 66.

ответ

1

Я предполагаю, что вы хотите что-то вроде этого:

int offset = (threadIdx.x == 33) ? threadIdx.x : 0; 
int val = bases[threadIdx.x + offset]; 

так, чтобы последняя нить получает ненулевое смещение от индекса потока в пределах блока. Тернарный оператор будет оцениваться условно и не будет вызывать расхождения ветвей. Тем не менее, я предлагаю пересмотреть использование размера блока, который не кратен размеру основы (32). Таким образом, вы будете тратить много ядер и циклов. Не было бы ничего, что могло бы остановить использование блока с 32 потоками, а последние два потока выполняли бы дополнительные вычисления, например, для покрытия 34 операций на блок.

+0

Он выглядит хорошо. Просто вопрос, 34-й поток будет тратить то же время на первой строке, что и другие 33, или мне нужно будет поместить __syncthreads()? @talonmies – elect

+0

Нет, для этого вам не нужен барьер синхронизации. – talonmies

Смежные вопросы