![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
ioManip |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 12.8.2011 Где: Благовещенск Репутация: нет Всего: нет |
Здравствуйте! Есть такая проблема, что при вычислении определенного интеграла на отрезке [0;1] (
Например при n = 10000, выдает 3,14159 и т.д а при n = 1000000, выдает 0,20384. Я не пойму почему так происходит. Я использую GTS 250 1Gb with CC 1.1 и Ubuntu 14.04 x64 Вот код main.cpp
kernel.h
kernel.cu
--------------------
Мечты не работают, пока ты не работаешь! |
||||||||
|
|||||||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Скорее всего, при сложении кучи маленьких чисел, накапливается ошибка округления.
Будьте аккуратнее! (a+b) + c != a + (b + c) |
|||
|
||||
tzirechnoy |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: -1 Всего: 16 |
заменить на
А то у вас только максимум первые 65536 значений вычисляются (blockDim * gridDim). Потому и, кстати, правильно всё получается если меньшэ 65536 шагов. Ну, и по поводу точности тожэ правильное замечание -- если складывать от бОльшых значений к мЕньшым -- то за 1000000 итэрацый можэт, при некотом невезении, до 1/17 от результирующего значения ошыбка накопиться. В общем, чтобы не париться, складывайте хотя бы в тип double. К тому жэ, сложэние тожэ можно распараллелить -- ну, в смысле, в рамках одного потока провести на GPU. Чтобы в итоге подсложыть только до 64k чисел. Но делайте через double всё равно. |
||||
|
|||||
ioManip |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 12.8.2011 Где: Благовещенск Репутация: нет Всего: нет |
У меня аппаратно не поддерживается данный тип. Карта старая gts250 на g92. На сколько я знаю, если даже double и написать, то все равно к float приводить будет. Ок, попробую --------------------
Мечты не работают, пока ты не работаешь! |
|||
|
||||
tzirechnoy |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: -1 Всего: 16 |
Так ты ведь не на карте суммируешь.
|
|||
|
||||
ioManip |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 12.8.2011 Где: Благовещенск Репутация: нет Всего: нет |
tzirechnoy, Да, все верно, просто бегло прочитал и не сразу понял о чем речь.
Попробовал использовать Ваши изменения и вот что вышло Просто поменял код ядра n = 10000 --> result: 3.1415908 n = 1000000 --> result: 3.9995644 Поменял код ядра и тип данных на double n = 10000 --> result: 0.4370185 n = 1000000 --> result: 1.1864045 Это сообщение отредактировал(а) ioManip - 13.11.2015, 13:02 --------------------
Мечты не работают, пока ты не работаешь! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |