Большие массивы в C - PullRequest
       36

Большие массивы в C

1 голос
/ 21 марта 2011

Я пытаюсь реализовать алгоритм OSEM (я пытаюсь, потому что я должен, а не просто для удовольствия), и у меня есть вопрос:

Поскольку я буду работать с очень большими матрицами, я хочу знать максимальный размер массива (язык C), который я могу выделить с помощью malloc. Из того, что я прочитал, зависит ваша ОС и аппаратное обеспечение: я работаю на Intel Xeon E5530 2,40 ГГц, 64 бит Red Had Enterprise, Nvidia Quadro FX 3800.

Матрицы, с которыми я буду работать, имеют примерно такие размеры: float / double 2000x1000x20.

Учитывая, что эти матрицы должны работать с CUDA C, я должен разместить матрицы в одномерных массивах следующим образом:

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

Заранее спасибо;)

Ответы [ 4 ]

6 голосов
/ 21 марта 2011

Это сравнительно небольшие места - около 160 МБ для float, 320 МБ для double. Если у вас не много этих матриц одновременно, проблем быть не должно.

Основное ограничение будет с CUDA, где вы можете быть ограничены общим объемом физической памяти на вашей видеокарте, но опять же, если у вас нет значительного количества этих матриц, то вы должны быть в порядке с любой текущей CUDA- совместимая видеокарта.

0 голосов
/ 28 марта 2011

Вот некоторые другие соображения.

  • Не беспокойтесь о матрицах большого размера, если только вам не нужно несколько изображений, которые могут насытить память GPU.

  • Если вы можете обрабатывать изображения с небольшим набором каждый раз, используйте AsyncAPI для загрузки / обработки / загрузки. При вычислении первого результата вы можете загрузить следующее изображение.

  • Эксперимент с CudaMallocHost , нестраничная память, т.е. НАМНОГО более быстрая передача данных

  • Экспериментируйте с Pitched Memory на устройстве, даже если оно потребляет больше памяти, обеспечивает лучшие характеристики доступа

  • Последнее, но не менее важное: получите лучшую карту: вы можете получить 360 ядер за ~ 200 $, например, с Gtx 460

0 голосов
/ 21 марта 2011

Максимальный размер массивов, которые вы можете использовать (т. Е. Максимальный объем памяти, который вы можете выделить, используя malloc в этом случае), ничем не ограничен в самом языке Си. Это полностью зависит от объема памяти, имеющейся у вас в машине.

0 голосов
/ 21 марта 2011

Теоретически, существует самый большой возможный буфер, который вы можете выделить в 64-битной системе: 2 64 , что намного больше, чем ваш массив 2000x1000x20. Он также намного больше, чем вся память, которую вы можете обрабатывать на компьютере.

В 32-битной системе обычно 2 ГБ. (Некоторые системы допускают 3 или 4 ГБ.) Это 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-битной системе.

Я бы об этом не беспокоился.

...