【发布时间】:2012-05-27 10:12:13
【问题描述】:
我必须将 8192x8192 矩阵读入内存。我想尽快完成。
现在我有这个结构:
char inputFile[8192][8192*4]; // I know the numbers are at max 3 digits
int8_t matrix[8192][8192]; // Matrix to be populated
// Read entire file line by line using fgets
while (fgets (inputFile[lineNum++], MAXCOLS, fp));
//Populate the matrix in parallel,
for (t = 0; t < NUM_THREADS; t++){
pthread_create(&threads[t], NULL, ParallelRead, (void *)t);
}
在函数ParallelRead 中,我解析每一行,执行atoi 并填充矩阵。并行性是逐行的,就像线程 t 解析行 t, t+ 1 * NUM_THREADS..
在具有 2 个线程的双核系统上,这需要
Loading big file (fgets) : 5.79126
Preprocessing data (Parallel Read) : 4.44083
有没有办法进一步优化?
【问题讨论】:
-
当有足够的数据可用时,也许您可以与 i/o 并行启动填充线程。
-
老实说,我有点惊讶您能够通过从多个线程读取同一个文件来获得 任何 性能改进...在进行基准测试时,您是确保文件实际上是从磁盘读取的,而不是从缓存中读取的?
-
@aix 我仅使用了 2 个线程。我已经并行化了预处理部分,这是在将数据读入内存之后。
-
我知道提高磁盘读取性能的唯一方法是:1)从压缩源读取数据。 2) 使用速度更快的磁盘或 RAID 阵列。或 3) 将数据拆分到单独的磁盘上,每个磁盘读取 1 个线程。通常,如果单个线程跟不上你的磁盘读取时间,你就有大问题了。
-
以二进制形式存储您的数据。如果每个矩阵元素最多可以取 256 个不同的值,那么我们在这里看到的是 64MB,这应该很容易被现代硬件处理。然后,您还可以将文件直接内存映射到您的程序中。
标签: c++ multithreading file-read