代码之家  ›  专栏  ›  技术社区  ›  Morgan Fouque

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

  •  2
  • Morgan Fouque  · 技术社区  · 7 年前

    目标:在内存中存储一个大型矩阵(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 回复  |  直到 7 年前
        1
  •  2
  •   Poeta Kodu    7 年前

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

    这至少需要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分钟。这很奇怪,因为搅拌机可以立即加载,可能需要1到2秒钟。将整个文件映射到内存并预分配缓冲区使我能够在不到5秒内加载文件。

    注:

    我可以在C或C++中完成这项工作,两者都可以。

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