C中的大型数组

时间:2011-03-21 13:41:35

标签: c matrix cuda dynamic-arrays

我正在尝试实施OSEM algorithm(我正在尝试,因为我必须,而不只是为了好玩),我有一个问题:

由于我将使用非常大的矩阵,我想知道我可以用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 个答案:

答案 0 :(得分:6)

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

主要的限制是CUDA,你可能会受到GPU卡上物理内存总量的限制,但是,除非你有大量的这些矩阵,否则你应该对任何现有的CUDA都没问题 - 兼容的GPU卡。

答案 1 :(得分: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位系统上分配那么多的内存。

我不担心。

答案 2 :(得分:0)

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

  • 除非您需要多张可能会使GPU内存饱和的图像,否则不要担心矩阵的大小。

  • 如果每次使用 AsyncAPI 上传/处理/下载,您都可以使用小集处理图像。在计算第一个结果时,您可以上传下一个图像。

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

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

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

答案 3 :(得分:-1)

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