【发布时间】:2018-08-12 06:35:52
【问题描述】:
目标:在内存中存储一个大型矩阵(Radon 矩阵),并将其传输到 GPU 内存中以进行大规模并行操作。
问题:可怕的阅读时间,以及空间的潜在次优使用(但不限制程序的使用)
我可以在 C 或 C++ 中执行此操作。
我收到的文件解析如下:
0.70316,0.71267,0.72221,0.73177,0.74135,0.75094,0.76053,0.77011,0.77967,0.7892,0.79868,0.80811,0.81747
这至少持续 50MB。
我的幼稚实现:
float ** Radon;
Radon = (float **)malloc(HeightxNproj * sizeof(float *));
for (int i = 0; i < Hauteur * Nproj; i++)
Radon[i] = (float *)malloc(WidthSquared * sizeof(float));
FILE *radonFile;
radonFile = fopen("radon.txt", "r");
if (radonFile == NULL)
{
printf("Radon file opening failed.");
return -1;
}
for (int i = 0; i < HeightxNproj; i++)
{
for (int j = 0; j < WidthSquared; j++)
{
fscanf(radonFile, "%f,", &Radon[i][j]);
}
}
fclose(radonFile);
printf("Radon loaded.");
我正在为 Windows 编程。我读过一些关于文件内存映射的内容,但我不知道这种实际上并未将矩阵存储在内存中的方法是否与 GPGPU 编程兼容。我正在使用 CUDA,我必须将此矩阵传递到 GPU 内存以进行并行操作。
这种文件读取方法执行得非常糟糕,读取和解析 50MB 文件大约需要一分钟。有没有办法缩短阅读和解析时间?矩阵也是稀疏矩阵,有没有常用的处理方法?
【问题讨论】:
-
从文本中解析浮点值的性能很糟糕,尤其是
fscanf:如果您必须非常精确(特别是如果您除了目标的精度之外还有其他输入,那么这是一个令人惊讶的复杂问题) FP型);此外,fscanf必须处理额外的约束(语言环境、锁定、...),并且您要为每个单个值支付fscanf开销(例如解析格式字符串)。您应该通过将文件映射到内存中直接解析二进制数据(或者如果文件不是太大,则直接在内存中读取),或者使用更有效的解析策略。 -
感谢您的澄清,至少我了解更多幕后发生的事情以及为什么如此缓慢。选定答案的方法给了我一个非常快的阅读时间。谢谢!
标签: c++ c matrix gpu sparse-matrix