Многопоточный хеширование MD5

Я пытаюсь многопоточности программы, которая берет слово из файла, затем хэшировать их и писать в другой.

Если я делаю это без многопоточности, это действительно быстро, он может использовать только 15-20% процессора и имеет скорость 300.000 строк / с.

Но когда я попробовал использовать многопоточность, он только замедлился и начал хэшироваться только со скоростью 17000 строк / с, не могли бы вы мне помочь?

Спасибо

#include <iostream>     // std::cout, std::streambuf, std::streamsize
#include <fstream>      // std::ifstream
#include <string>
#include <thread>
#include "md5.h"
using namespace std;

static const int num_threads = 10;

void call_from_thread(int tid) {
cout << "Launched by thread " << tid << std::endl;
int cl = 0;
int uscita = 0;
int parole = 0;
char* contents;
ifstream istr("test.txt");

if (istr) {
streambuf * pbuf = istr.rdbuf();
streamsize size = pbuf->pubseekoff(0, istr.end);
pbuf->pubseekoff(0, istr.beg);       // rewind
contents = new char[size];
pbuf->sgetn(contents, size);
istr.close();

ofstream myfile;
myfile.open("out.txt");

do {
string prova("");
uscita = 0;
do {
if (contents[cl] == '\n') {
uscita = 1;
}
prova += contents[cl];
cl += 1;
} while (uscita != 1);
parole += 1;
//cout << prova << ":" << md5(prova) << endl;
myfile << prova << ":" << md5(prova) << endl;
} while (parole != 9586054);

myfile.close();
}
}

int main()
{

thread t[num_threads];

//Launch a group of threads
for (int i = 0; i < num_threads; ++i) {
t[i] = thread(call_from_thread, i);
}

cout << "Launched from the main\n";

//Join the threads with the main thread
for (int i = 0; i < num_threads; ++i) {
t[i].join();
}

return 0;
}

0

Решение

Здесь вы видите, что все потоки читают один и тот же файл и выполняют одну и ту же работу. Это приводит к тому, что файл должен быть прочитан num_threads время, вероятно, вызывает замедление около num_threads (поскольку файловый ввод-вывод, вероятно, находится на критическом пути) или, возможно, даже больше из-за большего количества кеш-пропусков.

Вы можете попробовать прочитать весь файл в памяти, разделив его между потоками, а затем каждый поток обрабатывает подмножество содержимого этого файла.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]