2015-05-08 7 views
0

я в настоящее время работает над портированием модель лава потока в CUDA (полный код на GitHub здесь: Full source of the CUDA-SCIARA Fv2 lava flow modelCUDA - NVCC -G - если не работает должным образом

EDIT

Для того, чтобы воспроизвести. проблема, используйте инструкцию по github README, чтобы получить dev-копию проекта SCIARA_FV2_CUDA_MULTICELLS. Затем скомпилируйте опцию -G и передайте в качестве аргумента командной строки -c ../data/2006/PARAMETERS.cfg. (цитируемый код на линии 260 в этом file)

Я столкнулся с пр. oblem с конструкцией if внутри a __device__ функция.

Основываясь на текущем количестве и температуре лавы, он вычисляет новую температуру и, если она ниже, чем постоянный параметр (переменная d_PTsol=1143.0), лава отклонена.

Проблема в коде ниже - это прекрасно работает, если я скомпилирую с параметрами -G (для генерации информации об отладке кода устройства), но ведет себя неправильно.

double new_temp = d_computeNewTemperature(sommah,sommath);   
if(new_temp <= d_PTsol){ 
      printf("Solidified %.5f,%.5f\n",new_temp,d_PTsol); 
      double newQuote = d_sbts_updated[d_getIdx(row,col,ALTITUDE)]+d_sbts_current[d_getIdx(row,col,THICKNESS)]; 
      //CODE FOR LAVA SOLIDIFICATION HERE 
    }else{ 
      //there is lava and is not solidified -> activate this cell! 
      adjustAdaptiveGrid(row,col); 
} 

ouptutting что-то вроде этого в определенный момент моделирования:

Solidified 1344.68654 1143.00000 
Solidified 1343.99509 1143.00000 
Solidified 1320.50061 1143.00000 
Solidified 1325.53942 1143.00000 

Чтобы сделать вещи более тонкие проблемы укомплектовать исчезают, если изменить КРП условие строгого неравенства if(new_temp < d_PTsol).

Компиляция осуществляется со следующими параметрами и в отдельном режиме компиляции

-O3 -Xcompiler -fPIC -std=c++11 

и связывание с использованием

--cudart static --relocatable-device-code=true -gencode arch=compute_35,code=compute_35 -gencode arch=compute_35,code=sm_35 

ли кто-то сталкивался с аналогичной проблемой раньше? Я делаю что-то неправильно?

UPDATE

Проблема, кажется, так или иначе связанные с переводом из другой, если строить с < = как условие. Воплощение

if(new_temp <= d_PTsol) { 
     //solidification 
}else{ 
     //something else 
} 

в

if(new_temp <= d_PTsol) { 
     //solidification 
} 
if(!(new_temp <= d_PTsol)){ 
     //something else 
} 

делает код работает отлично.

+1

Это часто указывает на состояние гонки/унифицированную память/неопределенное поведение. Я предлагаю вам запускать вещи через cuda-memcheck, и это подталкивает (racecheck, synccheck, initcheck). – Jez

+0

@Jez Я уже запустил весь комплект cudamemcheck: утечка, запуск гонки и синхронизация. Все прошло чисто. Тогда почему условие гонки появляется только тогда, когда не компилируется с отладкой устройства? Кроме того, переменная new_temp является регистром и, по-видимому, не унициализирована (она правильно напечатана!). То же самое относится к переменной 'd_PTsol'. –

+0

Я снял вопрос слишком быстро в первый раз - извините. Это действительно странная проблема. Вы смогли проверить, выполняется ли код после выполнения инструкции печати? Возможно, во время оптимизации ошибочно перемещается оператор печати. Пример воспроизведения будет полезен. – Jez

ответ

2

У меня была аналогичная проблема. Мой код работал с параметром -G, но не без него. Мне просто нужно было добавить -fmad = false и -prec-div = false в параметры компилятора (подробнее см .: http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#options-for-steering-gpu-code-generation).

По умолчанию это значение истинно и оптимизирует операции с одной точностью, но ценой вашей точности. Если вы включите режим отладки, эта оптимизация будет отключена. Мне нужны были точные значения, поэтому мой код работал только с -G. Возможно, у вас есть аналогичная проблема.(дополнительная информация о точности с плавающей запятой CUDA: http://docs.nvidia.com/cuda/cuda-c-programming-guide/#mathematical-functions-appendix)

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