C++ (Qt)// первый шаг#pragma omp parallel forfor (int i = 0; i < matr.size(); ++i) { CalcLayers(matr[i]); CalcBounds(matr[i]);} //... какой-то не параллельный код // второй шаг#pragma omp parallel forfor (int i = 0; i < matr.size(); ++i) { CalcLayers(matr[i]); // опять нужен CalcLayers и он даст те же результаты что и на шаге 1 CalcInterior(matr[i]);}
C++ (Qt)// первый шаг#pragma omp parallel forfor (int i = 0; i < matr.size(); ++i) { data = CalcLayers(matr[i]); SaveLayers( i, data ); // сохранили во внешнем хранилище данные, ключом является индекс CalcBounds(matr[i]);} //... какой-то не параллельный код // второй шаг#pragma omp parallel forfor (int i = 0; i < matr.size(); ++i) { data = ReadLayers( i ); // читаем из внешнего хранилища данные для нужного индекса CalcInterior(matr[i]);}
// первый шаг#pragma omp parallel forfor (int i = 0; i < matr.size(); ++i) { data = CalcLayers(matr[i]); SaveIndex(i); //Сохраняем индекс SaveLayers( data ); //и данные CalcBounds(matr[i]);} //... какой-то не параллельный код // второй шаг#pragma omp parallel forfor (int i = 0; i < matr.size(); ++i) { index = ReadIndex(); //Считываем иднекс data = ReadLayers(); // и данные CalcInterior(matr[index]);}
// второй шаг#pragma omp parallel forfor (int i = 0; i < matr.size(); ++i) { index = ReadIndex(); //Считываем иднекс data = ReadLayers(); // и данные CalcInterior(matr[index]);}
C++ (Qt)#include <QCoreApplication>#include <QtConcurrentMap>#include <QFutureWatcher>#include <QFile>#include <QThread>#include <QDebug>#include <sys/mman.h>#include <unistd.h>#include <errno.h> static const int count = 10000;static const int bufSize = sizeof( int ); static int pageSize; struct Data{ int handle; int index;}; bool writeData( const Data &data ){ qDebug() << "Process index = " << data.index << "( thread id =" << QThread::currentThreadId() << ")"; off_t offsetHi = (data.index * bufSize) / pageSize; off_t offsetLo = (data.index * bufSize) % pageSize; void *address = mmap( 0, pageSize + bufSize, PROT_WRITE, MAP_SHARED, data.handle, offsetHi * pageSize ); if( address == MAP_FAILED ) { qDebug() << "mmap error" << errno; return false; } int *dst = static_cast<int *>( address + offsetLo ); *dst = data.index; munmap( address, pageSize + bufSize ); return true;} bool readData( const Data &data ){ off_t offsetHi = (data.index * bufSize) / pageSize; off_t offsetLo = (data.index * bufSize) % pageSize; void *address = mmap( 0, pageSize + bufSize, PROT_READ, MAP_SHARED, data.handle, offsetHi * pageSize ); if( address == MAP_FAILED ) { qDebug() << "mmap error" << errno; return false; } int *src = static_cast<int *>( address + offsetLo ); qDebug() << "Check index = " << data.index << (( *src == data.index )? "Ok" : "Error"); munmap( address, pageSize + bufSize ); return true;} int main( int argc, char *argv[] ){ QCoreApplication app( argc, argv ); pageSize = sysconf( _SC_PAGESIZE ); QFile file( "data.bin" ); if( !file.open( QIODevice::ReadWrite ) ) { qWarning() << "File open error"; return 1; } file.resize( bufSize * count ); QList<Data> data; for( int i = 0; i < count; ++i ) { Data d; d.handle = file.handle(); d.index = i; data.append( d ); } qDebug() << "Write"; QFutureWatcher<bool> writer; writer.setFuture( QtConcurrent::mapped( data, writeData ) ); writer.waitForFinished(); qDebug() << "Read"; QFutureWatcher<bool> reader; reader.setFuture( QtConcurrent::mapped( data, readData ) ); reader.waitForFinished(); return 0;}