cudaMemcpyToSymbol просто зависает и никогда не возвращается. Обработка графического процессора на 100%. Код прекрасно работает на K40, но не на V100

У меня есть следующий фрагмент кода:

__constant__ int baseLineX[4000];
__constant__ int baseLineY[4000];
__constant__ int guideLineX[4000];
__constant__ int guideLineY[4000];
__constant__ int rectangleOffsets[8];

__constant__ float blurKernel[64];

<other code>

for(int i = 0; i < 8; i++)
hostRectangleOffsets[i] = i;

cudaMemcpyToSymbol(rectangleOffsets, hostRectangleOffsets, 8*sizeof(int));

Этот код прекрасно работает на Tesla K40, но не на Tesla V100 16 ГБ. (Даже мой ноутбук может работать с кодом на 4 ГБ Quaddro M2200 GPU).

Код просто висит на V100 и никогда не возвращается из вызова cudaMemcpyToSymbol, но выглядит так, как будто он все еще обрабатывается на GPU. Есть идеи?

-2

Решение

Ну, вы не предоставили Минимальный, полный, проверяемый пример: Ваш код не компилируется и в нем отсутствуют операторы, но есть (очевидно) не относящиеся к делу операторы. Так что — никто не может на самом деле проверить.

Я все еще могу сделать несколько предложений, хотя:

  1. Попробуйте использовать асинхронную версию этого вызова: cudaMemcpyToSymbolAsync(). По крайней мере, ваша программа не зависнет …
  2. Для начала запустите вашу программу или приложение в отладчике (например, nSID nVIDIA на большинстве систем или их расширение до Visual Studio в Windows); в качестве альтернативы, присоедините отладчик к процессу зависания (Инструкции MSVS, Инструкция Eclipse — старая).
  3. Запустите процесс с включенным дампом ядра (если вы работаете в системе Unix), убейте его, когда он зависнет, затем откройте дамп ядра в отладчике, и вы по крайней мере получите обратную трассировку
  4. Попробуйте перестроить вашу программу с меньшим количеством включенных оптимизаций — это иногда помогает, по крайней мере, в диагностических целях (это может сочетаться с предыдущими предложениями).
-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]