Каковы возможные причины ошибки сегментации при использовании компилятора nvcc CUDA?

У меня есть класс CUDA, назовем его A, определенный в файле заголовка. Я написал тестовое ядро, которое создает экземпляр класса A, который отлично компилируется и дает ожидаемый результат.

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

Обновление:

Чтобы уточнить, ошибка сегментации происходит во время компиляции, а не при запуске ядра. Строка, которую я использую для компиляции:

`nvcc --cubin -arch compute_20 -code sm_20 -I<My include dir> --keep kernel.cu`

где <My include dir> - это путь к моему локальному пути, содержащему некоторые файлы заголовков служебных программ.

Мой вопрос: прежде чем тратить много времени на изоляцию минимального примера, демонстрирующего поведение (нетривиально из-за относительно большой базы кода), сталкивался ли кто-нибудь с подобной проблемой? Может ли компилятор nvcc выйти из строя и умереть, если ядро ​​слишком длинное или использует слишком много регистров?

Если такая проблема, как счетчик регистров, может таким образом повлиять на компилятор, мне нужно будет переосмыслить, как реализовать мое ядро, чтобы использовать меньше ресурсов. Это также будет означать, что сокращение всего до минимального примера, скорее всего, устранит проблему. Однако, если это даже невозможно, я не хочу тратить время на тупик, а скорее попытаюсь сократить все до минимального примера и отправлю отчет об ошибке в NVIDIA.

Обновление:

По предложению @njuffa я повторно запустил компиляцию с включенным флагом -v. Вывод заканчивается следующим:

#$ ptxas  -arch=sm_20 -m64 -v  "/path/to/kernel_ptx/kernel.ptx"  -o "kernel.cubin" 
Segmentation fault
# --error 0x8b --

Это говорит о том, что проблема связана с программой ptxas, которая не может сгенерировать двоичный файл CUDA из файла ptx.


person naitsirhc    schedule 11.12.2012    source источник
comment
nvcc - это драйвер компилятора, а не компилятор. Вы уверены, что ошибка сегмента исходит от nvcc?   -  person Roger Dahl    schedule 12.12.2012
comment
Ошибка сегментации возникает после выполнения следующей команды: nvcc --cubin -arch compute_20 -code sm_20 -I<my include dir> --keep kernel.cu   -  person naitsirhc    schedule 12.12.2012
comment
Какую версию CUDA вы используете?   -  person Robert Crovella    schedule 12.12.2012
comment
Если компилятор CUDA 5.0 (т. Е. Один из его компонентов) дает сбой, сообщите об ошибке через сайт разработчика, зарегистрированный CUDA, приложив автономный вариант воспроизведения. Чтобы убедиться, что segfault действительно находится в компоненте компилятора CUDA, временно добавьте -v в командную строку nvcc, чтобы вы могли видеть вызов каждого базового компонента компилятора.   -  person njuffa    schedule 12.12.2012
comment
@ robert-crovella Я использую CUDA 5.0. В частности, nvcc --version сообщает Cuda compilation tools, release 5.0, V0.2.1221   -  person naitsirhc    schedule 12.12.2012
comment
Компоненты компилятора никогда не должны выходить из строя независимо от ввода, так что это внутренняя ошибка PTXAS. Вы можете получить доступ к зарегистрированному сайту разработчика здесь: developer.nvidia.com/cuda-toolkit. Прокрутите немного вниз до места, где говорится, что участники программы зарегистрированных разработчиков CUDA могут сообщать о проблемах и сообщать об ошибках (если вы еще не зарегистрированы, запрос на регистрацию обычно обрабатывается в течение одного рабочего дня). Поскольку проблема связана с PTXAS, вы можете прикрепить свой входной файл PTX к ошибке и запомнить точную командную строку PTXAS.   -  person njuffa    schedule 12.12.2012
comment
@njuffa, спасибо за подсказку. Я отправил свой запрос на регистрацию и отправлю отчет об ошибке, как только он будет обработан. Я оставлю этот вопрос открытым до тех пор, пока он не будет решен тем или иным способом.   -  person naitsirhc    schedule 12.12.2012
comment
В предыдущем проекте использование некоторых функций объекта поверхности (ограниченных sm_30 и более поздних версий) с Arch sm_20 вызывало такие ошибки. Вы можете проверить, проходит ли компиляция с sm_30.   -  person Florent DUGUET    schedule 15.05.2016
comment
@naitsirhc, примите этот ответ.   -  person einpoklum    schedule 01.06.2017


Ответы (1)


Похоже, это была настоящая ошибка в ассемблере CUDA 5.0 ptxas. Об этом сообщили в NVIDIA, и мы можем предположить, что это было исправлено где-то в течение более чем трех лет с тех пор, как был задан вопрос и добавлен этот ответ.

[Этот ответ был составлен из комментариев и добавлен как запись сообщества, чтобы убрать этот вопрос из списка неотвеченных вопросов]

person Community    schedule 15.05.2016