Моя программа анализирует видеофайл, который представляется в виде трехмерного массива и отправляется из LabView в мою программу. LabView уже сглаживает этот трехмерный массив в одномерный массив, поэтому я только что выделил одномерный массив в CUDA, используя cudaMalloc и cudaMemcpy для копирования данных. Однако я заметил, что если я отправляю более 2XXX изображений размером 120x240 пикселей, я получаю «неизвестную ошибку» от некоторых моих функций памяти cuda (cudamemcpy и cudafree, которые возникают позже в моей программе после вызова нескольких ядер) и в конечном итоге они нарушают мою программу. Однако, если я уменьшу количество изображений, которые я отправляю, у меня не будет проблем. Это наводит меня на мысль, что мой код в порядке, но мои методы распределения памяти плохи.
Для начала поговорим о Pitched memory. Насколько мне известно, все дело в выборе хорошего размера для выделения памяти, чтобы линейные данные не разделялись на два фрагмента. Это особенно характерно для 2D- и 3D-массивов, поскольку вы хотите хранить строки или столбцы вместе в памяти для быстрого доступа.
Могут ли возникнуть такие проблемы, если я не использую память с шагом? Какие ошибки могут возникнуть, если не использовать память с шагом, особенно для таких очень больших массивов? До этого момента я игнорировал возможность использования cudaMallocPitch и cudaMalloc3d, хотя технически у меня есть массивы 2d и 3d, которые я сгладил.
Наконец, как я могу отлаживать проблемы с моим кодом, когда cudaGetLastError сообщает мне только «неизвестная ошибка»? Я могу найти, какая функция виновата, но когда она чем-то похожа на cudaFree, у меня нет возможности отлаживать такие вещи или выяснять, где возникает проблема.
В любом случае спасибо за помощь.