ホームページ  >  記事  >  バックエンド開発  >  C++ で分散コンピューティングに STL を使用するにはどうすればよいですか?

C++ で分散コンピューティングに STL を使用するにはどうすればよいですか?

WBOY
WBOYオリジナル
2024-06-03 14:48:56934ブラウズ

C++ で分散コンピューティングに STL を使用するにはどうすればよいですか? STL アルゴリズムの並列化を使用して、エグゼキュータと連携し、画像処理パイプラインなどの実用的なケースを開発します。

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

C++ で分散コンピューティングに STL を使用する方法

はじめに

分散コンピューティングでは、複数のコンピューター ノードにタスクを分散して処理速度を向上させます。 C++ 標準テンプレート ライブラリ (STL) は、分散コンピューティング アプリケーションの開発を可能にする同時実行ツールを提供します。

STL アルゴリズムの並列化

std::async 関数と std::future 関数を使用して STL アルゴリズムを並列化できます。 std::async は非同期タスクを開始し、タスクによって生成された std::future オブジェクトへのハンドルを返します。 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;

Executor の使用

Executor は同時実行ライブラリの一部であり、スレッド プール全体でタスクを管理するための抽象化を提供します。 STL アルゴリズムは、std::execution::Parallel_unsequenced 戦略を使用してエグゼキュータ上で並列化できます。

// 图像处理管道
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();
  }
};
実際的なケース

画像処理パイプラインの並列化

🎜🎜 画像操作のサイズ変更、変換、保存など、画像を処理するパイプラインがあると想像してください。これらの操作を並列化することで、パイプラインのスループットを大幅に向上させることができます。 🎜rrreee🎜 STL の同時実行ツールとエグゼキューターを使用すると、C++ で効率的な分散コンピューティング アプリケーションを簡単に開発できます。 🎜

以上がC++ で分散コンピューティングに STL を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。