并行化这个的最佳方法是什么?

时间:2012-09-16 01:42:49

标签: c++ c parallel-processing opencl

我有一个由大约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很新,所以我真的在寻找有关如何做到这一点的建议。

2 个答案:

答案 0 :(得分:3)

OpenCL不是我文本处理的首选。虽然,可能存在一些有意义的问题。你能否将整个算法分解成步骤,看看瓶颈是什么(解析文件后你会对数据做什么?)?将这些字符串移到各种总线上以便稍后减少可能不是最理想的。尽早减少它们。看起来你甚至没有减少它们,只是拆分流,但保持数据为字符串?

如果确实解析和转换值是瓶颈,那么我建议你继续尝试将大文件分解成适合内存的块。

答案 1 :(得分:1)

瓶颈是读取文件还是解析?如果它是读数,那么除了将文件存储在更快的介质上之外,没有太多可以做到的。如果它是解析,你可以将整个文件读入一个数组或std::vector然后使用线程,其中每个线程正在解析数组/向量的一部分。