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

Reading and storing large matrix file for GPU

目标:在内存中存储一​​个大矩阵(Radon矩阵),并将其传输到GPU内存中进行大规模并行运算。

问题:可怕的阅读时间,以及 space 的潜在次优使用(但不限制程序的使用)

我有可能在 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 编程。我读过一些关于File Memory Mapping的内容,但我不知道这种实际上不是将矩阵存储在内存中的方法是否与GPGPU编程兼容。我正在使用 CUDA,我必须将此矩阵传递到 GPU 内存以进行并行操作。

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

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

and this goes on for at least 50MB.

这还不算多。

The files i'm receiving are parsed as follows: 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

  • 用二进制保存可以节省大约一半的内存(甚至更多)。这也将提高阅读速度。
  • 一次读取整个文件。

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

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

注:

I can do this in either C or C++, both are ok.

在涉及内存管理时,永远不要将 C 与 C++ 混合使用,除非您确定自己在做什么。如果不使用 RAII 保护 C 动态分配的内存,C++ 异常会导致巨大的内存泄漏。