1

Тема: Як використати усі ядра?

Зазвичай програма використовує лише один поток (пів ядра) процесора, а треба додати у код щось таке, щоб використовувалися усі ядра.
В код типу цього уривка

#include <iostream>
#include <vector>
#include <string>
#include <unordered_set>
#include <sstream>
#include <fstream>
#include <algorithm>
using namespace std;
std::string readFile(const std::string& fileName);
vector<string> removeDupWord(string str);
int main()
{
    string input_file_name, output_file_name;
    cout << "Input file name: ";
    cin >> input_file_name;
    cout << "Output file name: ";
    cin >> output_file_name;
    
    string str = readFile(input_file_name);
    std::vector<std::string> words=removeDupWord(str);
    ofstream out_file(output_file_name.c_str());
    std::sort(words.begin(), words.end());
    for (int i=0; i<words.size(); i++)
    {
        out_file << words[i] << endl;
    }
    return 0;
}

2 Востаннє редагувалося Betterthanyou (21.02.2024 12:45:18)

Re: Як використати усі ядра?

Вам потрібно використовувати потоки для того щоб задіяти всі ядра процесора
https://en.cppreference.com/w/cpp/thread/thread

*Приклад не перевіряв

#include <iostream>
#include <vector>
#include <string>
#include <unordered_set>
#include <sstream>
#include <fstream>
#include <algorithm>
#include <thread>
#include <mutex>
using namespace std;

std::string readFile(const std::string& fileName);
vector<string> removeDupWord(string str);
void worker(vector<string>& words, unordered_set<string>& wordSet, mutex& mtx);

int main()
{
    string input_file_name, output_file_name;
    cout << "Input file name: ";
    cin >> input_file_name;
    cout << "Output file name: ";
    cin >> output_file_name;
    
    string str = readFile(input_file_name);
    vector<string> words;
    istringstream iss(str);
    for(string s; iss >> s; )
        words.push_back(s);

    unordered_set<string> wordSet;
    mutex mtx;

    vector<thread> threads;
    for (unsigned i = 0; i < thread::hardware_concurrency(); ++i)
        threads.push_back(thread(worker, ref(words), ref(wordSet), ref(mtx)));

    for (auto& th : threads) th.join();

    vector<string> uniqueWords(wordSet.begin(), wordSet.end());
    sort(uniqueWords.begin(), uniqueWords.end());

    ofstream out_file(output_file_name.c_str());
    for (const auto& word : uniqueWords)
        out_file << word << endl;

    return 0;
}

void worker(vector<string>& words, unordered_set<string>& wordSet, mutex& mtx)
{
    while (true)
    {
        mtx.lock();
        if (words.empty())
        {
            mtx.unlock();
            break;
        }
        string word = words.back();
        words.pop_back();
        mtx.unlock();
        mtx.lock();
        wordSet.insert(word);
        mtx.unlock();
    }
}