Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verwende ich STL für verteiltes Rechnen in C++?

Wie verwende ich STL für verteiltes Rechnen in C++?

WBOY
WBOYOriginal
2024-06-03 14:48:56932Durchsuche

Wie verwende ich STL für verteiltes Rechnen in C++? Durch die Verwendung der STL-Algorithmus-Parallelisierung, die Zusammenarbeit mit Ausführenden und die Entwicklung praktischer Fälle wie Bildverarbeitungs-Pipelines.

如何在 C++ 中使用 STL 进行分布式计算?

So verwenden Sie STL für verteiltes Rechnen in C++

Einführung

Beim verteilten Rechnen werden Aufgaben auf mehrere Computerknoten verteilt, um die Verarbeitungsgeschwindigkeit zu erhöhen. Die C++ Standard Template Library (STL) bietet Parallelitätstools, mit denen Sie verteilte Computeranwendungen entwickeln können.

Parallelisieren von STL-Algorithmen

Sie können STL-Algorithmen parallelisieren, indem Sie die Funktionen std::async und std::future verwenden. std::async startet eine asynchrone Aufgabe und gibt ein Handle an das von der Aufgabe generierte std::future-Objekt zurück. std::asyncstd::future 函数将 STL 算法并行化。std::async 启动一个异步任务,返回指向该任务生成的 std::future 对象的句柄。

// 计算无序向量中所有整数的总和
std::vector<int> numbers = {1, 2, 3, 4, 5};
int sum = 0;

// 并行化 for_each 算法
std::for_each(numbers.begin(), numbers.end(), [&](int n) {
  std::future<int> result = std::async(std::launch::async, [] { return n * n; });

  // 在另一个线程中执行的计算
  sum += result.get();
});

std::cout << "Sum: " << sum << std::endl;

Using Executors

执行器是并发性库的一部分,提供了跨线程池管理任务的抽象。可以使用 std::execution::parallel_unsequenced

// 查找向量中所有奇数
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::vector<int> oddNumbers;

// 使用执行器上的 parallel_unsequenced 策略
std::execution::parallel_unsequenced(numbers.begin(), numbers.end(),
                                    [&](int n) { if (n % 2) oddNumbers.push_back(n); });

std::cout << "Odd numbers: ";
for (int n : oddNumbers) {
  std::cout << n << " ";
}
std::cout << std::endl;

Executors verwenden

Executors sind Teil der Parallelitätsbibliothek und bieten eine Abstraktion für die Verwaltung von Aufgaben über Thread-Pools hinweg. STL-Algorithmen können auf dem Executor mithilfe der Strategie std::execution::parallel_unsequenced parallelisiert werden.

// 图像处理管道
struct ImageProcessingPipeline {
  // 调整大小
  std::vector<std::future<cv::Mat>> resizeTasks;

  // 转换
  std::vector<std::future<cv::Mat>> convertTasks;

  // 保存
  std::vector<std::future<void>> saveTasks;

  // 执行管道
  std::vector<cv::Mat> execute(const std::vector<cv::Mat>& images) {
    for (const cv::Mat& image : images) {
      // 并行化调整大小
      resizeTasks.emplace_back(std::async(std::launch::async,
                                         [&image] { return resize(image, 500, 500); }));
    }

    // 等待所有调整大小的任务完成
    for (auto& task : resizeTasks) task.get();

    // 并行化转换
    for (auto& resizedImage : resizeTasks) {
      convertTasks.emplace_back(
          std::async(std::launch::async, [&resizedImage] { return convert(resizedImage); }));
    }

    // 等待所有转换任务完成
    for (auto& task : convertTasks) task.get();

    // 并行化保存
    for (auto& convertedImage : convertTasks) {
      saveTasks.emplace_back(std::async(std::launch::async,
                                     [&convertedImage](const std::string& path) { return save(convertedImage, path); },
                                     "output/image_" + std::to_string(i) + ".jpg"));
    }

    // 等待所有保存任务完成
    for (auto& task : saveTasks) task.get();
  }
};
Praktischer Fall

Parallelisierende Bildverarbeitungspipeline

🎜🎜Stellen Sie sich vor, Sie hätten eine Pipeline zum Verarbeiten von Bildern, einschließlich Vorgängen zur Größenänderung, Konvertierung und Speicherung von Bildern. Durch die Parallelisierung dieser Vorgänge können Sie den Pipeline-Durchsatz erheblich steigern. 🎜rrreee🎜Durch die Verwendung der Parallelitätstools und Executoren von STL können Sie problemlos effiziente verteilte Computeranwendungen in C++ entwickeln. 🎜

Das obige ist der detaillierte Inhalt vonWie verwende ich STL für verteiltes Rechnen in C++?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn