Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Проблема с CUDA, разные результаты Debug и Release |
Автор: Bitman 10.7.2015, 13:03 | ||
Проблема с вроде-бы элементарным кодом на CUDA. Высчитывает среднее арифметическое по массиву. каждый элемент переводится во float и делится на кол-во элементов, это значение помещается в shared memory. Затем делается scan, все данные в shared memory складываются, результат в последней ячейке. Потом последняя задача в блоке этот результат добавляет через atomicAdd к переменной в глобальной памяти. Всё это замечательно работает при компиляции в Debug режиме. Используется CUDA 7.0 и VisualStudio 10. Как только переключаю на Release, начинает считать некорректно, а точнее среднее значение получается капельку меньше, чем то, что должно быть, например при среднем 1500 на 0.5-0.7 меньше. Причём эта капелька намного разная от запуска к запуску. Если в Release в настройках CUDA C/C++ , Device включить параметр Generate GPU debug information = Yes (-G), то Release код начинает работать корректно, но раза в 2 примерно медленней. Честно говоря, не знаю уже куда копать :( Вот этот код: P.S. Могу выслать проект целиком.
|
Автор: Bitman 10.7.2015, 23:14 | ||
Продолжаю копать. Где-то всё равно есть гонки в алгоритме :( Вот результаты тестовых прогонов версии Release. Первое число считается serial алгоритмом, сначала идёт суммирование массива 1M в double, а в конце делим на 1M. Второе число тоже serial, только тут каждое делится на 1M, а потом всё это суммируется. Третье число - считается на CUDA аналогично 2-му варианту. Явно где-то гонки, но где?!
|
Автор: Bitman 12.7.2015, 10:32 | ||
Ларчик просто открывался, нужен был барьер внутри цикла. |