Код работает на Windows, но запускает сбои на Linux - PullRequest
0 голосов
/ 30 октября 2018

Прежде всего: я совершенно не могу создать MCVE, поскольку могу воспроизвести его только при запуске полного кода, любая попытка измерить или воспроизвести ошибку в более простой среде заставляет ее исчезнуть. TDLR Я подозреваю, что это не проблема кода, а проблема конфигурации.


У меня есть кусок кода для некоторой математики по ядрам в CUDA. У меня Windows-машина Win10 x64, GTX 1050, CUDA 9.2 и Ubuntu 17.04, 2xGTX 1080 Ti, CUDA 9.1.

Мой код хорошо работает на машине с Windows. Это долго (~ 700 мс на ядро ​​для больших выборок), поэтому мне нужно было увеличить значение TDR в Windows. Код также (на данный момент) заставляет его работать в 1 графическом процессоре, первый из которых выбран с cudaSetDevice(0).

Когда я копирую те же входные данные и код на машину linux (я использую git, это тот же код), я получаю либо

 an illegal memory access was encountered

или

 unspecified launch failure

в моей проверке ошибок после вызова графического процессора.

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

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

Мой вопрос: что еще я должен посмотреть? На какую конкретную конфигурацию Linux мне следует взглянуть, чтобы точно определить причину остановки ядра?

1 Ответ

0 голосов
/ 31 октября 2018

Ошибка в результате оказалась действительно недопустимым доступом к памяти.

Это было вызвано тем, что sizeof(unsigned long) зависит от конкретной машины, и моя машина linux возвращает 8, а моя машина Windows возвращает 4. Поскольку этот код вызывается из MATLAB и MATLAB (как некоторые другие языки высокого уровня, такие как python) ) определяет размеры переменных в битах (например, uint32(1)), при выполнении memcpys в машине linux было несоответствие. Оказывается, это произошло в переменной, которая является индексом, поэтому ядра считывали мусор (из-за плохого memcpy), но затем пытались получить доступ к другому массиву в этом месте, создавая недопустимую ошибку памяти.

Слишком конкретно? да.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...