2017-01-07 1 views
0

Я использую ALEA GPU для программирования GPU (C#). Если я использую Atomic Operation, например atomic_add в ядре, я получаю ошибку «Не удалось разрешить имя» в окне CUDA WarpWatch для моих переменных во время отладки ядра. Я вижу значения blockIdx.x, blockDim.x, threadIdx.x и массивов, но имена переменных не могут быть разрешены. Ядро работает так, как ожидалось, но переменные не могут контролироваться во время отладки, что затрудняет исправление ошибок. CUDA 8 Toolkit установлен, и я использую Visual Studio 2015.«Не удалось разрешить имя» при отладке ядра ALEA с атомной операцией (atomic_add)

Любые идеи?

+1

Вы скомпилировали код отладки, то есть проект отладки? –

+0

Да. Я сделал все, что было написано на сайте ALEAGPU. Проект работает в режиме отладки. Я уже могу отладить его и перешагнуть через Ядро. Если никакой атомной операции нет, я могу увидеть значения переменных. В противном случае я вижу ошибку «Не удалось разрешить имя» в окне Warp Watch. Мне пришлось записывать значения переменных в консоль (в коде ядра), чтобы я мог следить за тем, что происходит. –

+0

@RobertCrovella, учитывая мое понимание ALEA GPU, я не уверен, что здесь участвует компиляция CUDA. Отладочная информация, похоже, не управляется компилятором CUDA, а скорее решением ALEA. –

ответ

1

Это происходит из-за некоторых оптимизаций, выполняемых с помощью NVIDIA NVVM, независимо от того, скомпилирован ли он в режиме отладки или выпуска. Он присваивает некоторым значениям регистры, и в настоящее время нет способа их перевернуть. Поведение CUDA C очень похоже. Единственный способ получить результаты - записать их в глобальную память, чтобы обмануть распределение регистров или записать их на консоль в ядре, как вы это делали. На данный момент я не знаю другого подхода.

Смежные вопросы