3

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

4

2 回答 2

3

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

如果确实解析和转换值是瓶颈,那么我建议您继续将大文件分解成可以放入内存的块的实验。

于 2012-09-16T01:48:02.430 回答
1

瓶颈是文件的读取还是解析?如果是读数,那么除了将文件存储在更快的介质上之外,您无能为力。如果是解析,您可以将整个文件读入数组或std::vector然后使用线程,其中每个线程都在解析数组/向量的一部分。

于 2012-09-16T02:04:28.857 回答