-G включает отладку кода устройства (путем генерации символов отладки) и отключает оптимизацию кода устройства.-g - это опция для компилятора хоста, которая позволяет генерировать символы отладки для кода хоста (и может отключить оптимизацию кода хоста).
Это, вероятно, указывает на состояние гонки в вашем коде, которое устраняется, когда оптимизации отключены.Например, вы можете пропустить __syncthreads()
в коде вашего устройства, что сделает код правильным.Без этого компилятор может перемещать нагрузки или сохранять их, что приводит к неверным результатам.Такое движение кода является вполне допустимой оптимизацией, если барьеры (__syncthreads()
) не пересекаются.Когда вы указываете -G, такая оптимизация, вероятно, отключается, и поэтому условие гонки не проявляется.
Во-первых, убедитесь, что происходит сбой кода GPU, а не кода CPU, отключив отладку GPU (remove -G), но включаю отладку процессора (оставьте -g).
Затем сузьте его до конкретного отказавшего ядра (процесс сужения зависит от программы).Изучите это ядро и найдите места, где вам может потребоваться синхронизация (часто используются зависимости совместно используемой памяти), но ее нет.
Если вы не можете найти ее, но можете сузить ее доконкретное ядро, которое дает неправильные результаты, попробуйте поделиться здесь кодом ядра, если это возможно, чтобы другие могли помочь вам увидеть проблему.