переменные cudamalloc vs __device__ [duplicate]

Пакет Visual Studio NuGet необходимо обновить для новой версии набора инструментов

У меня просто возникла проблема с подключением libpng с Visual Studio 2013. Проблема в том, что в файле пакета были только библиотеки для Visual Studio 2010 и 2012.

Правильное решение - надеяться, что разработчик выпустит обновленный пакет и затем обновит его, но он работал для меня, взломав дополнительную настройку для VS2013, указав на файлы библиотеки VS2012.

Я отредактировал пакет (в папке packages внутри каталога решения), найдя packagename\build\native\packagename.targets и внутри этого файла, скопировав все секции v110. Я изменил v110 на v120 в полях условий только очень осторожно, чтобы пути с именами файлов были все как v110. Это просто позволило Visual Studio 2013 подключиться к библиотекам на 2012 год, и в этом случае он работал.

2
задан Michael Puglia 30 October 2013 в 03:17
поделиться

2 ответа

Глобальная память может быть назначена статически (используя __device__), динамически (используя устройство malloc или new) и через время выполнения CUDA (например, с помощью cudaMalloc).

Все вышеперечисленные методы физически выделяют память того же типа, то есть память, вырезанная из борта (но не на чипе) подсистема DRAM.

Поскольку динамические распределения занимают некоторое ненулевое время, может быть производительность (например, __device__) или через API среды выполнения (т. е. cudaMalloc и т. д.). Это позволяет избежать динамического использования времени в начале вашей программы, распределите память во время чувствительных к производительности областей вашего кода.

Также обратите внимание, что 3 метода, которые я описываю, имея аналогичные методы доступа, подобные C / C ++, из кода устройства, имеют разные методы доступа от хоста. Доступ к статически выделенной памяти осуществляется с помощью функций API времени выполнения, таких как cudaMemcpyToSymbol и cudaMemcpyFromSymbol, доступ к распределенной памяти, доступной по времени выполнения, осуществляется с помощью обычных функций типа cudaMalloc / cudaMemcpy и динамически распределенной глобальной памяти (устройства new и malloc) напрямую не доступен из хоста.

10
ответ дан Robert Crovella 28 August 2018 в 18:35
поделиться

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

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

Я не думаю, что глобально заявленная память дает большую производительность по динамически распределенной глобальной памяти, так как проблема коалесценции все еще существует. Также глобальная память, объявленная в глобальной (переменной) области, невозможна в случае глобальной памяти CUDA. Переменные, которые могут объявляться глобально (в программе), являются постоянными переменными памяти и текстурой, которые мы не обязаны передавать ядрам в качестве аргументов.

для оптимизации памяти см. Раздел оптимизации памяти в cuda c руководство по лучшей практике http://docs.nvidia.com/cuda/cuda-c-best-practices-guide/#memory-optimizations

1
ответ дан Sijo 28 August 2018 в 18:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: