Ошибка сегментации CUDA в потоках без кода CUDA

0

У меня есть этот код:

__global__ void testCuda() {}

void wrapperLock()
{
    std::lock_guard<std::mutex> lock(mutexCudaExecution);

    // changing this value to 20000 does NOT trigger "Segmentation fault"
    usleep(5000);
    runCuda();
}

void runCuda()
{
    testCuda<<<1, 1>>>();
    cudaDeviceSynchronize();
}

Когда эти функции выполняются из примерно 20 потоков, я получаю Segmentation fault. Как написано в комментарии, изменение значения в usleep() до 20000 отлично работает.

Есть ли проблема с CUDA и потоками?
Мне кажется, что CUDA нужно немного времени, чтобы восстановиться, когда выполнение закончилось, даже когда ему нечего было делать.

  • 0
    Позвольте мне сказать прямо: вы запускаете несколько потоков хоста, и каждый пытается запустить ядро CUDA? Только один контекст CUDA?
  • 0
    Да, но они НЕ выполняются одновременно из-за std :: lock_guard, который блокирует запуск другого ядра CUDA до тех пор, пока предыдущее не завершилось! Это в моих глазах так странно.
Показать ещё 8 комментариев
Теги:
multithreading
cuda

2 ответа

0
Лучший ответ

ОБНОВИТЬ:

Согласно http://docs.nvidia.com/cuda/cuda-c-programming-guide/#um-gpu-exclusive проблема заключалась в одновременном доступе к унифицированной памяти, которую я использую. Мне пришлось обернуть вызовы ядра CUDA и получить доступ к Unified Memory с помощью std::lock_guard и теперь программа работает без проблем в течение 4 дней при загрузке тяжелых потоков.

Я должен вызвать в каждом потоке, как это было предложено Marco & Robert - cudaSetDevice иначе он снова cudaSetDevice.

  • 0
    Я не очень понимаю, почему кто-то думает, что ответ бесполезен! Я признаю, что допустил ошибку, и ответ должен помочь другим проверить свой код перед публикацией в SO. У меня есть по крайней мере cojones для администрирования собственной ошибки / ошибки.
3

Используя один контекст CUDA, несколько потоков хоста должны либо делегировать свою работу CUDA потоку контекст-владельца (аналогично рабочему потоку), либо связывать контекст с cuCtxSetCurrent (API-интерфейс драйвера) или cudaSetDevice, чтобы не перезаписывать контекстные ресурсы.

  • 0
    Я не способен разобраться в этом. Было бы очень мило с вашей стороны, если бы вы могли предоставить мне пример кода, что делать в функции runCuda (), как инициализировать ее в main () ...
  • 0
    @AlBundy Это может вам помочь: devblogs.nvidia.com/parallelforall/…
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню