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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读取和存储GPU的大矩阵文件相关的知识,希望对你有一定的参考价值。

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

答案

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

这持续至少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三维模型的算法。该模型大约为10 MB,加载大约需要1-2分钟。这很奇怪,因为Blender可以立即加载它 - 可能是1或2秒。将整个文件映射到内存并预分配缓冲区允许我在不到5秒的时间内加载文件。

注意:

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

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

以上是关于读取和存储GPU的大矩阵文件的主要内容,如果未能解决你的问题,请参考以下文章

Python处理alist文件——稀疏矩阵的读取和存储

Python处理alist文件——稀疏矩阵的读取和存储

优化Scala代码以读取不适合内存的大文件的有效方法

C程序:从文件中读取矩阵数据,并显示出来,利用链式存储结构。

C程序:从文件中读取矩阵数据,并显示出来,利用链式存储结构。

如何处理来自 S3 的大文件并在 Spring Batch 中使用它