У меня есть файл, который состоит из около 800 000 строк. Каждая строка состоит из идентификатора, кода и данных, каждое поле разделено табуляцией.
3445 aaaa Some data here for instance
89002 aree Some other data
В качестве простого упражнения для знакомства с OpenCL я решил проанализировать этот файл с помощью OpenCL. Каждый рабочий элемент проходит одну строку и обрабатывает ее. Каждая строка длиной 4000 символов.
__kernel void parse_line(
__global const char * lines, // IN
__global unsigned * id, // OUT
__global char * code, // OUT
__global char * data // OUT
)
{
// parse the line to extract id, code and data
}
При условии CL_DEVICE_MAX_WORK_GROUP_SIZE
1024, я не могу иметь более 1024 рабочих элементов одновременно. Я не могу ни закачать весь файл в память GPU (CL_DEVICE_MAX_MEM_ALLOC_SIZE
только 268353536).
Первая идея может состоять в том, чтобы проанализировать первый пакет из 1024 предложений, затем второй и так далее, оставляя ядру задачу обрабатывать одно предложение. Я также мог бы переписать ядро так, чтобы вместо синтаксического анализа одного предложения оно анализировало 16, тогда 1024 рабочих элемента обрабатывали бы около 16384 предложений.
Как я уже упоминал ранее, я довольно новичок в OpenCL, поэтому я действительно ищу советы о том, как лучше всего это сделать.
OpenCL не был бы моим первым выбором для обработки текста. Хотя, вероятно, есть некоторый набор проблем, для которых это имеет смысл. Можете ли вы разбить весь алгоритм на этапы и посмотреть, что является узким местом (собираетесь ли вы что-либо делать с данными после анализа файла?)? Перемещение этих строк по различным автобусам, которые будут сокращены позже, вероятно, неоптимально. Уменьшите их при первой возможности. Похоже, вы даже не сокращаете их, просто разделяете поток, но сохраняете данные в виде символьных строк?
Если действительно разбор и преобразование значений являются узким местом, то я бы рекомендовал продолжить ваш эксперимент по разбивке большого файла на блоки, которые могут поместиться в памяти.
Узким местом является чтение файла или разбор? Если это чтение, то мало что можно кроме хранения файла на более быстром носителе. Если это анализ, вы можете прочитать весь файл в массив или std::vector
затем используйте потоки, где каждый поток анализирует часть массива / вектора.