读取和存储 GPU 的大型矩阵文件

Reading and storing large matrix file for GPU

本文关键字:文件 大型 存储 GPU 读取      更新时间:2023-10-16

目标:在内存中存储一个大型矩阵(氡矩阵),并将其传输到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.");

我正在为窗口编程。我已经阅读了一些关于文件内存映射的信息,但我不知道这种方法实际上并没有将矩阵存储在内存中,是否与 GPGPU 编程兼容。我正在使用 CUDA,我必须将此矩阵传递到 GPU 内存以进行并行操作。

这种文件读取方法执行得非常糟糕,读取和解析 50MB 文件大约需要一分钟。有没有办法缩短读取和解析时间?矩阵也是稀疏矩阵,有没有常用的处理方式来处理这样的矩阵?

文件的单独访问越多,性能损失就越大。您应该采取的第一步是估计您需要从文件中读取的信息数量,并一次性读取它。它将大大提高您的性能。您可以使用内存映射文件。

这种情况至少持续 50MB。

这并不多。

我收到的文件解析如下:

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
  • 将其保存在二进制中以节省大约一半的内存(甚至更多)。这也将提高阅读速度。
  • 一次读取整个文件。

一个例子会让你意识到你的方法是多么幼稚和缓慢:

一旦我正在实现正在读取 3d 模型.obj算法。该模型大约为 10 MB,加载大约需要 1-2 分钟。这很奇怪,因为Blender可以立即加载它 - 也许是1或2秒。将整个文件映射到内存并预先分配缓冲区使我在不到 5 秒的时间内加载文件。

注意:

我可以用 C 或 C++ 来做到这一点,两者都可以。

在内存管理方面,永远不要将 C 与 C++ 混为一谈,除非您确定自己在做什么。如果不使用 RAII 保护 C 动态分配的内存,C++异常可能会导致大量内存泄漏。