读取和存储 GPU 的大型矩阵文件
Reading and storing large matrix file for GPU
目标:在内存中存储一个大型矩阵(氡矩阵),并将其传输到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++异常可能会导致大量内存泄漏。
- 如何在 c++ 中通过 http 发送大型视频文件?
- 使用 RapidXML 解析大型 XML(大小大于 65 KB)文件时出现问题
- 使用大型头文件
- 读取C++中的大型CSV文件(~4GB)
- 将大型二进制字符串写入二进制文件
- 在 C++ 优化中合并大型二进制文件
- 将大型 csv 文件读入数组 c++ 中
- 有效地从文本文件中读取带有字符串索引的大型二维数组(矩阵)
- 在读取大型 txt 文件时动态分配结构内的向量
- makefile和错误将与大型项目分开的文件编译
- 在C 中读取大型CSV文件性能问题
- 如何在大型文本文件中对数字进行排序
- 如何将大型二进制文件(10000k 位)转换为基数 3 或基数 31?
- 使用 fgets() c++ 读取大型 txt 文件时的 CPU 使用率为 99%
- 在大型 JSON 文件中查找文本
- 读取和存储 GPU 的大型矩阵文件
- 并行阅读多个大型CSV文件
- 读取C++中的大型映射文本文件
- C :CryptenCrypt无法加密大型文件
- 大型文件的C 浮点异常