Повторное использование потоков в CUDA

У меня есть большая серия чисел в массиве, около 150 МБ чисел, и мне нужно найти последовательные последовательности чисел, последовательности могут быть от 3 до 160 чисел. поэтому, чтобы упростить задачу, я решил, что каждый поток должен начинаться, например, как ThreadID = CellID.

Таким образом, поток 0 смотрит на ячейку 0, и если число в ячейке 0 соответствует моей последовательности, то нить 0 = ячейка 1 и так далее, и если число не совпадает, поток останавливается, и я делаю это для своих 20000 потоков.

Так что это работает, хорошо, но я хотел знать, как повторно использовать потоки, потому что массив, в котором я ищу серию чисел, намного больше.

Так что я должен разделить свой массив на более мелкие массивы и загрузить их в общую память, а также перебрать количество меньших массивов и (в конечном итоге дополнить последний). Или я должен хранить большой массив в глобальной памяти, и мой поток должен быть ThreadID = cellID, а затем ThreadID = cellID + 20000 и т. д., или есть лучший способ пройти.

Чтобы уточнить: на данный момент я использую 20 000 потоков, 1 массив чисел в глобальной памяти (150 МБ) и последовательность чисел в общей памяти (например: 1,2,3,4,5 ), представленный в виде массива. Thread0 начинается с Cell0 и проверяет, равна ли ячейка 0 в глобальной памяти ячейке 0 в общей памяти, если да, поток 0 сравнивает ячейку 1 в глобальной памяти с ячейкой 1 в общей памяти и так далее, пока не будет полного совпадения.

Если числа в обеих ячейках (глобальной и общей памяти) не равны, этот поток просто отбрасывается. Поскольку большинство чисел в массиве глобальной памяти не будут соответствовать первому числу моей последовательности. Я подумал, что было бы неплохо использовать один поток для сопоставления Cell_N в GM с Cell_N в ShM и перекрывать потоки. и этот метод позволяет получить объединенный доступ к памяти в первый раз, поскольку каждый поток от 0 до 19 999 будет обращаться к непрерывной памяти.

Но то, что я хотел бы знать, это то, "какой был бы лучший способ повторно использовать потоки", которые были отброшены, или потоки, которые закончили соответствовать. Чтобы можно было сопоставить весь массив размером 150 МБ, а не просто сопоставить (20000 чисел + (длина последовательности -1)).


person Anoracx    schedule 18.01.2014    source источник
comment
Почему вы не можете использовать обычный подход ID = blockIdx.x*blockDim.x+threadIdx.x; вместо того, чтобы помещать потоки в цикл?   -  person Farzad    schedule 18.01.2014
comment
Ваш вопрос мне не очень ясен. Вначале вы говорите: Мне нужно найти последовательные последовательности чисел. Это означает, что у вас может быть несколько возможных последовательных последовательностей, например, 1,4,7,14 и 5,8,11,64 и так далее и тому подобное. Позже вы говорите: числа в cell0 соответствуют моей последовательности. Это означает, что вы ищете определенную последовательность. Не могли бы вы прояснить этот момент? В последнем случае кажется, что вы ищете алгоритм, соответствующий шаблону, и в этом случае я бы направил вас к алгоритму, подобному Смиту-Уотерману.   -  person Vitality    schedule 18.01.2014
comment
Правильно сформулировать свою проблему – это большой шаг к ее решению.   -  person Vitality    schedule 18.01.2014
comment
Спасибо за предложение, я прояснил проблему, хотя я сомневаюсь, что smith-waterman является решением этой проблемы, сопоставление чисел довольно прямолинейно, я просто хотел бы знать, как правильно повторно использовать нить в этом конкретном случае.   -  person Anoracx    schedule 18.01.2014


Ответы (1)


«Как лучше всего повторно использовать потоки», которые были отброшены, или потоки, которые закончились для соответствия. Чтобы можно было сопоставить весь массив размером 150 МБ, а не просто сопоставить (20000 чисел + (длина последовательности -1)).

Вы можете повторно использовать потоки аналогично каноническому Пример сокращения CUDA (с использованием окончательной реализации в качестве эталона).

int idx = threadIdx.x+blockDim.x*blockIdx.x;
while (idx < DSIZE){
  perform_sequence_matching(idx);
  idx += gridDim.x*blockDim.x;
  }

Таким образом, с произвольным количеством потоков в вашей сетке вы можете покрыть произвольный размер проблемы (DSIZE);

person Robert Crovella    schedule 18.01.2014