omp ordered для ввода/вывода убивает параллельность.
А теперь я еще и удалил всю прогу, ошибившись в маске
Блиа, стал уже думать, как замутить undelete при помощи dd + grep , но вспомнил, что настроил в виме backup'ы в отдельный каталожег. Фуф.
Так вот оно, падла, все равно выполняет последовательноа как вы планировали стрим (ifstream) читать параллельно? для этого надо файл в разных потоках открыть, поseek-аться в нужное место и читать параллельно
но про async io вы правильно подметили, что возможно, у вас прога просядет на многопоточном чтении вместо однопоточного
зы: в omp ничего не понимаю
в omp ничего не понимаюну типа оно и видно по предыдущему посту
Как я понял, топикстартер хочет, чтобы чтение было последовательным, но обработка шла параллельно с чтением. В его случае (обработка занимает примерно столько же времени, сколько и чтение данных) это может оказаться очень полезным.
Т.е., вопрос состоит в том, как средствами OpenMP реализовать producer/consumer. Гугл говорит, что OpenMP не очень-то заточен на такой сценарий и что, если всё же хочется его использовать, то надо смотреть в сторону OpenMP dependency graph.
Т.е., вопрос состоит в том, как средствами OpenMP реализовать producer/consumer. Гугл говорит, что OpenMP не очень-то заточен на такой сценарий и что, если всё же хочется его использовать, то надо смотреть в сторону OpenMP dependency graph.Мне даже не нужен producer/consumer в широком смысле, так как эти части, которыми я считываю, они логически связаны, т.е. надо считывать их целиком в память для обработки. Т.е. надо именно пока один читает с диска, считать другую часть. И вопрос тут именно про openMP и указанную семантику ordered (судя по описанию должно быть как я хочу, но тесты четко показывают обратно: пробовал и printf'ы вставлять, и запускать top и iotop и смотреть: четко, 20 секунд считывает, 20 — 100% загрузка проца, а IO на нуле и т.д.).
А если бы мне это захотелось сверхэффективно написать, полез бы почитал как раз соседний тред.
posix_fadvise(fd,0,0,POSIX_FADV_SEQUENTIAL|POSIX_FADV_NOREUSE|POSIX_FADV_DONTNEED);
Это заставит операционную систему делать упреждающее чтение из файла и по возможности не забивать кеш его содержимым. Из цикла обработки попробуй убрать распараллеливание и, возможно, уменьши partSize — это заставит программу чуть чаще вызывать чтение из файла и должно повлиять на мнение ОС о твоём паттерне обращения к файлу.
Параллельно читать fstream не надо; последовательное чтение даёт скорость, близкую к скорости последовательного доступа к диску, т.е., максимум, который может выдавать диск в установившемся режиме. Попытка параллельного чтения заставит диск делать много seek'ов (если это только не SSD что убьет производительность.Если raid1, то в два потока будет быстрее, и если raid0 то может быть тоже.
Более того, в том же raid1 данные то будут лежать на дисках страйпами, поэтому автоматически получится, что при линейном чтении данные будут параллельно подгружаться с разных дисков.
Более того, в том же raid1 данные то будут лежать на дисках страйпами, поэтому автоматически получится, что при линейном чтении данные будут параллельно подгружаться с разных дисков.Страйпами - это raid0, raid1 - это зеркало.
Если страйпы достаточно малы, то однозначно будет ускоряться последовательное чтение, а от нескольких потоков будет замедление. Если велики, то тоже по идее будет, но не факт, что так же хорошо, как в несколько потоков - зависит от интеллектуальности планировщика в/в.
В raid1 чтение в два потока однозначно распараллелится, последовательное чтение в один поток - может быть тоже в теории, но на практике не так круто получается.
хм, похоже, что надо вботать реализацию omp в gcc, потому что с icc та же программа ведет себя идеально. Правда во время чтения проц грузит на 100%, неужели spinlock?
Оставить комментарий
Serab
Идея такая: надо обработать несколько увесистых частей большого файла. Причем считывание одной части (порядка гига) в память занимает примерно равное с вычислениями время, поэтому решил, что элементарным улучшением будет добавление omp:Так вот оно, падла, все равно выполняет последовательно, т.е. второй тред не начинает выполнение ordered до того, как первый закончит итерацию целиком. Что я делаю не так?
За
1) префиксный инкремент,
2) тупую сериализацию,
3) использование тредов тут,
не гнобить плз, вопрос скорее по openmp, чем по async i/o