У меня есть большая серия чисел в массиве, около 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)).
ID = blockIdx.x*blockDim.x+threadIdx.x;
вместо того, чтобы помещать потоки в цикл? - person Farzad   schedule 18.01.20141,4,7,14
и5,8,11,64
и так далее и тому подобное. Позже вы говорите: числа вcell0
соответствуют моей последовательности. Это означает, что вы ищете определенную последовательность. Не могли бы вы прояснить этот момент? В последнем случае кажется, что вы ищете алгоритм, соответствующий шаблону, и в этом случае я бы направил вас к алгоритму, подобному Смиту-Уотерману. - person Vitality   schedule 18.01.2014