1

我正在尝试实现OSEM 算法(我在尝试是因为我必须这样做,而不仅仅是为了好玩)并且我有一个问题:

因为我将使用非常大的矩阵,所以我想知道我可以使用 malloc 分配的最大数组大小(C 语言)。根据我的阅读,这取决于您的操作系统和硬件:我正在使用 Intel Xeon E5530 2.40 Ghz、Red Had Enterprise 64 位、Nvidia Quadro FX 3800。

我将使用的矩阵具有以下尺寸:float/double 2000x1000x20。

鉴于这些矩阵要与 CUDA C 一起使用,我必须将矩阵分配在一维数组中,如下所示:

float*matrix=(float*)malloc(sizeof(float)*2000*1000*20));

提前致谢 ;)

4

4 回答 4

6

这些是相对较小的分配 - float 大约 160 MB,double 大约 320 MB。除非您同时拥有很多这些矩阵,否则应该没有问题。

主要限制是 CUDA,您可能会受到 GPU 卡上物理内存总量的限制,但同样,除非您有大量这些矩阵,否则您应该可以使用任何当前与 CUDA 兼容的 GPU 卡.

于 2011-03-21T13:45:37.140 回答
0

以下是其他一些注意事项。

  • 不要担心矩阵大小虽然很大,除非您需要多个可能使 GPU 内存饱和的图像。

  • 如果您每次都可以处理少量图像,请务必使用AsyncAPI上传/处理/下载。在计算第一个结果时,您可能会上传下一张图片。

  • 试用 CudaMallocHost,不可分页内存,即更快的数据传输

  • 在设备上试用Pitched Memory,即使它消耗更多内存也能提供更好的访问性能

  • 最后但并非最不重要的一点是获得更好的卡:您可以以约 200 美元的价格获得 360 个内核,例如使用Gtx 460

于 2011-03-27T20:22:27.897 回答
0

从理论上讲,您可以在 64 位系统上分配的最大缓冲区是 2 64,这比您的 2000x1000x20 数组大得多。它也比您可以用计算机处理的所有内存大得多。

在 32 位系统上,它通常是 2GB。(某些系统允许 3 或 4GB。)即 2.1 * 10 9字节。是sizeof(float)4 个字节。让我们看看,你有:

2000 * 1000 * 20 = 4 * 10 7

乘以浮点数的大小:

4 * 10 7 * 4 = 1.6 * 10 8

尽管 1.6*10 8是一个令人印象深刻的数字,但您甚至可以在 32 位系统上分配这么多内存。

我不会担心的。

于 2011-03-21T13:44:08.147 回答
-1

您可以使用的数组的最大大小(即malloc在这种情况下您可以分配的最大内存量)不受 C 语言本身的任何限制。这完全取决于机器中可用的内存量。

于 2011-03-21T13:45:48.010 回答