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

时间:2018-03-04 14:12:55

标签: c++ c matrix gpu sparse-matrix

目标:在内存中存储一​​个大矩阵(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文件。有没有办法缩短阅读和解析时间?矩阵也是一个稀疏矩阵,有没有常见的方法来处理这样的矩阵?

1 个答案:

答案 0 :(得分:2)

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

  

这至少持续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

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

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

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

注意:

  

我可以用C或C ++来做,两者都可以。

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