我有一个由大约800 000行组成的文件。每行由id,代码和数据组成,每个字段由TAB分隔。
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很新,所以我真的在寻找有关如何做到这一点的建议。
答案 0 :(得分:3)
OpenCL不是我文本处理的首选。虽然,可能存在一些有意义的问题。你能否将整个算法分解成步骤,看看瓶颈是什么(解析文件后你会对数据做什么?)?将这些字符串移到各种总线上以便稍后减少可能不是最理想的。尽早减少它们。看起来你甚至没有减少它们,只是拆分流,但保持数据为字符串?
如果确实解析和转换值是瓶颈,那么我建议你继续尝试将大文件分解成适合内存的块。
答案 1 :(得分:1)
瓶颈是读取文件还是解析?如果它是读数,那么除了将文件存储在更快的介质上之外,没有太多可以做到的。如果它是解析,你可以将整个文件读入一个数组或std::vector
然后使用线程,其中每个线程正在解析数组/向量的一部分。