я в настоящее время работает над портированием модель лава потока в 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
}
делает код работает отлично.
Это часто указывает на состояние гонки/унифицированную память/неопределенное поведение. Я предлагаю вам запускать вещи через cuda-memcheck, и это подталкивает (racecheck, synccheck, initcheck). – Jez
@Jez Я уже запустил весь комплект cudamemcheck: утечка, запуск гонки и синхронизация. Все прошло чисто. Тогда почему условие гонки появляется только тогда, когда не компилируется с отладкой устройства? Кроме того, переменная new_temp является регистром и, по-видимому, не унициализирована (она правильно напечатана!). То же самое относится к переменной 'd_PTsol'. –
Я снял вопрос слишком быстро в первый раз - извините. Это действительно странная проблема. Вы смогли проверить, выполняется ли код после выполнения инструкции печати? Возможно, во время оптимизации ошибочно перемещается оператор печати. Пример воспроизведения будет полезен. – Jez