| Re: using rand() function with OpenMP | |
| От: | Sergey Chadov | ||
| Дата: | 23.05.09 05:46 | ||
| Оценка: | +1 | ||
| Здравствуйте, wotker, Вы писали: W>Добрый вечер. W>Помогите разобраться: почему матрица, инициализированная с помощью процедуры initMatrix, в результате имеет одинаковые строки? W>Спасибо. Потому что seed для rand() у каждого потока свой. Поэтому у тебя будет столько одинаковых последовательностей сколько ты используешь потоков. -- Sergey Chadov ... << RSDN@Home 1.2.0 alpha rev. 685>> |
| Re[4]: using rand() function with OpenMP | |
| От: | Sergey Chadov | ||
| Дата: | 24.05.09 09:48 | ||
| Оценка: | +1 | ||
| Здравствуйте, Кодт, Вы писали: SC>>Если бы функция rand сохраняла свое состояние в глобальной переменной, то при вызове ее из разных потоков были бы та-а-акие фейерверки. Поэтому каждый поток имеет свой seed. К>Ну прямо уж феерверки. Если никак не защищать — то прямо фейерверки. Я сам наблюдал на самодельном генераторе. К> Что, сложно сделать атомарный доступ к семечку? На interlocked? Тоже вариант. К>Конечно, TLS — это тоже решение: у каждого потока семечко своё. Там ведь структура ptd не только для rand нужна, поэтому почему бы еще и seed туда не запихать, я такое решение вполне понимаю. К>Но ведь требования о независимости случайных последовательностей в разных потоках в Стандарте не записаны, так что это самодеятельность MS. Обратного там тоже не записано. Значит MS действует здесь в рамках стандарта. К>Ладно бы поведение нереентерабельной функции было не определено при реентере. (Как, скажем, printf с двух рук стрелять). К>Это легко исправляется, если мы поместим вызов такой функции в критическую секцию. К>
К>Однако, хотя вызовы строго сериализованы, эффект прежний — у нас не одна последовательность, а много, на каждый поток своя. Если критическая секция без спинкаунта — это сильный удар по производительности. Если со спинкаунтом — то конечно значительно менее сильный, но что-то мне кажется что решение с tls проще и эффективнее. -- Sergey Chadov ... << RSDN@Home 1.2.0 alpha rev. 685>> |
| using rand() function with OpenMP | |
| От: | wotker | ||
| Дата: | 22.05.09 17:32 |
Добрый вечер. Помогите разобраться: почему матрица, инициализированная с помощью процедуры initMatrix, в результате имеет одинаковые строки? Спасибо. |
| Re: using rand() function with OpenMP | |
| От: | _Vasilyev | ||
| Дата: | 23.05.09 13:00 |
| Здравствуйте, wotker, Вы писали: W>
W>Добрый вечер. W>Помогите разобраться: почему матрица, инициализированная с помощью процедуры initMatrix, в результате имеет одинаковые строки? W>Спасибо. а задай как-нибудь так :
|
| Re: using rand() function with OpenMP | |
| От: | wotker | ||
| Дата: | 23.05.09 21:23 |
Не очень понятно. Ведь функция rand сохраняет свое состояние (которое используется для генерации следующего числа) в глобальной переменной (а как же еще?). Эта переменная является разделяемой. Следовательно, если функция была вызвана в 2х потоках, то и возвращаемые значения тоже должны быть разными. Да, спасибо. Все работает корректно. |
| Re[2]: using rand() function with OpenMP | |
| От: | Sergey Chadov | ||
| Дата: | 24.05.09 06:42 |
| Здравствуйте, wotker, Вы писали: W>Не очень понятно. Ведь функция rand сохраняет свое состояние (которое используется для генерации следующего числа) в глобальной переменной (а как же еще?). Эта переменная является разделяемой. Следовательно, если функция была вызвана в 2х потоках, то и возвращаемые значения тоже должны быть разными. Если бы функция rand сохраняла свое состояние в глобальной переменной, то при вызове ее из разных потоков были бы та-а-акие фейерверки. Поэтому каждый поток имеет свой seed. -- Sergey Chadov ... << RSDN@Home 1.2.0 alpha rev. 685>> |
| Re[3]: using rand() function with OpenMP | |
| От: | wotker | ||
| Дата: | 24.05.09 07:04 |
| Здравствуйте, Sergey Chadov, Вы писали: W>Если бы функция rand сохраняла свое состояние в глобальной переменной, то при вызове ее из разных потоков были бы та-а-акие фейерверки. Поэтому каждый поток имеет свой seed. Мне не понятна Ваша фраза "Поэтому каждый поток имеет свой seed.". Меня интересует, как это реализовано. Если Вам не сложно, приведите кусок кода на С (т.к. я уже не понимаю как openMP определяет, какие одни переменные должны быть локальными, а другими — общими). Касательно фейверков: Поэтому, нет гарантии, что они не случатся в других реализациях. |
| Re[4]: using rand() function with OpenMP | |
| От: | Sergey Chadov | ||
| Дата: | 24.05.09 07:42 |
| Здравствуйте, wotker, Вы писали: W>Мне не понятна Ваша фраза "Поэтому каждый поток имеет свой seed.". Меня интересует, как это реализовано. Если Вам не сложно, приведите кусок кода на С Так почитайте исходники CRT, благо их никто не скрывает.
где
Это майкрософтовские, но не суть. W> (т.к. я уже не понимаю как openMP определяет, какие одни переменные должны быть локальными, а другими — общими). OpenMP здесь не причем. W>Касательно фейверков: W> W>Поэтому, нет гарантии, что они не случатся в других реализациях. Стандарт С++ вообще не определяет никакой потокобезопасности. Поэтому, строго говоря, ни одна функция стандартной библиотеки потокобезопасной не является. Однако есть еще и здравый смысл, благодаря которому оно все же работает так как работает. -- Sergey Chadov ... << RSDN@Home 1.2.0 alpha rev. 685>> |
| Re[4]: using rand() function with OpenMP | |
| От: | Аноним 872 | ||
| Дата: | 24.05.09 07:50 |
| W>Мне не понятна Ваша фраза "Поэтому каждый поток имеет свой seed.". Меня интересует, как это реализовано. thread local storage |
| Re[5]: using rand() function with OpenMP | |
| От: | wotker | ||
| Дата: | 24.05.09 08:10 |
| Вопросов нет. Спасибо. |
| Re[3]: using rand() function with OpenMP | |
| От: | Кодт модератор | ||
| Дата: | 24.05.09 08:57 |
| Здравствуйте, Sergey Chadov, Вы писали: SC>Если бы функция rand сохраняла свое состояние в глобальной переменной, то при вызове ее из разных потоков были бы та-а-акие фейерверки. Поэтому каждый поток имеет свой seed. Ну прямо уж феерверки. Что, сложно сделать атомарный доступ к семечку? На interlocked? Конечно, TLS — это тоже решение: у каждого потока семечко своё. Но ведь требования о независимости случайных последовательностей в разных потоках в Стандарте не записаны, так что это самодеятельность MS. Ладно бы поведение нереентерабельной функции было не определено при реентере. (Как, скажем, printf с двух рук стрелять). Это легко исправляется, если мы поместим вызов такой функции в критическую секцию.
Однако, хотя вызовы строго сериализованы, эффект прежний — у нас не одна последовательность, а много, на каждый поток своя. Перекуём баги на фичи! |
| Re[5]: using rand() function with OpenMP | |
| От: | Кодт модератор | ||
| Дата: | 24.05.09 18:22 |
| Здравствуйте, Sergey Chadov, Вы писали: SC>Если критическая секция без спинкаунта — это сильный удар по производительности. Если со спинкаунтом — то конечно значительно менее сильный, но что-то мне кажется что решение с tls проще и эффективнее. Оно не проще, оно иначе. У него семантика другая. Функция-то с побочным эффектом. А критическая секция — просто пример, как сделать сериализацию. Перекуём баги на фичи! |
| Re[5]: using rand() function with OpenMP | |
| От: | Кодёнок | ||
| Дата: | 26.05.09 06:30 |
| Здравствуйте, Sergey Chadov, Вы писали: SC>Если никак не защищать — то прямо фейерверки. Я сам наблюдал на самодельном генераторе. Можно подробнее, какие эффекты появляются? |
| Re[6]: using rand() function with OpenMP | |
| От: | Sergey Chadov | ||
| Дата: | 26.05.09 11:52 |
| Здравствуйте, Кодёнок, Вы писали: SC>>Если никак не защищать — то прямо фейерверки. Я сам наблюдал на самодельном генераторе. Кё>Можно подробнее, какие эффекты появляются? Случайность сильно страдает -- Sergey Chadov ... << RSDN@Home 1.2.0 alpha rev. 685>> |
| Re[6]: using rand() function with OpenMP | |
| От: | Кодт модератор | ||
| Дата: | 27.05.09 08:20 |
Lock-free алгоритм
Правда, он не wait-free; если между GET и CAS кто-то будет всё время вламываться и выполнять rand() полностью, то получим голодание. Как допилить до wait-free — надо подумать. ... << RSDN@Home 1.2.0 alpha 4 rev. 1207>> Перекуём баги на фичи! |