Cuda Различное распределение памяти - PullRequest
2 голосов
/ 07 декабря 2010

Я занимаюсь разработкой небольшого приложения с использованием CUDA.
У меня есть огромный массив 2d (не помещается в общую память), в котором потоки во всех блоках будут постоянно читать в случайных местах.
этот 2d массив является массивом только для чтения.
где я должен выделить этот 2d массив? глобальная память? постоянная память? память текстур?

Ответы [ 3 ]

2 голосов
/ 07 декабря 2010

В зависимости от размера текстурной памяти вашего устройства, вы должны реализовать его в этой области. Действительно, текстурная память основана на последовательном механизме кэширования локальности. Это означает, что доступ к памяти оптимизируется, когда потоки последовательных идентификаторов пытаются достичь элементов данных в относительно близких местах хранения.
Кроме того, эта местность здесь реализована для 2D-доступа. Поэтому, когда каждый поток достигает элемента данных массива, хранящегося в памяти текстур, вы получаете последовательный двухмерный доступ. Следовательно, вы в полной мере используете архитектуру памяти.

К сожалению, эта память не так велика, и с огромными массивами вы могли бы в нее вписать свои данные. В этом случае вы не можете избежать использования глобальной памяти.

1 голос
/ 09 декабря 2010

Я согласен с jHackTheRipper, простым решением было бы использовать текстурную память, а затем профилировать с помощью Compute Visual Profiler. Вот хороший набор слайдов от NVIDIA о различных типах памяти для свертки изображений; это показывает, что хорошее использование совместно используемой памяти и глобальных чтений было не слишком быстрым, чем использование текстурной памяти. В вашем случае вы должны получить несколько объединенных чтений из текстовой памяти, которые вы обычно не получите при доступе к случайным значениям в глобальной памяти.

0 голосов
/ 09 декабря 2010

Если он достаточно мал, чтобы соответствовать константе или текстуре, я бы просто попробовал все три.

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

...