🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

並列処理

複数の計算が同時に実行される手法

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

15839閲覧

マルチスレッドでCPUのコア/スレッド数を超えたスレッドを指定するということはどういうこと?

iMori

総合スコア1

CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

並列処理

複数の計算が同時に実行される手法

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2020/12/11 15:46

編集2020/12/11 16:04

知りたいこと

今日マルチスレッドについて触れたばかりです。
全体的に並列処理についての理解がありません。

OpenMPを使用してマルチスレッド化を試みているのですが、

並列計算をする際にCPUに記載されたコア数/スレッド数を超えたスレッド数を設定できます。
それによって計算速度も上昇します。
これが一体何を意味するのか、ということが知りたいです。

cpuはi7 9700F,8コア8スレッドです。
https://ark.intel.com/content/www/jp/ja/ark/products/193738/intel-core-i7-9700f-processor-12m-cache-up-to-4-70-ghz.html

実装内容

並列計算は以下のように書いていて

C++

1#include <omp.h> // OpenMP 2~~~~省略~~~~ 3int N = 1000000; 4#pragma omp parallel for num_threads(num) // numの値がスレッド数にあたる 5 for(int i = 0; i < N; i++)process(); // 100万の処理

process()は

C++

1 int num = 0; 2 for(int i = 0; i < 10000; ++i) // 内部で1万ループする 3 { 4 ++num; 5 }

process内1個の計算時間は0.02msくらい

計測結果

スレッド数とその速度を表にまとめた図が下です。
イメージ説明

18スレッドまではCPUのコアが利用できるのでわかります。
16
512までCPUコア数、スレッド数超えた状態で指定すると、指定スレッド数が倍々で上がるにつれ計算効率が最大3%くらい上昇しています。
なぜ上昇するのかもよくわかってないんですが、
一番知りたいのは、CPUに記載されてるスレッド数を越して設定して大丈夫なのか?という点です。
どなたかご教授いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

マルチスレッドと CPU のコア数は関連ありません。CPU のコアが一つでもスレッドは複数立てられます。マルチスレッドはあくまで「並行処理」の仕組みであり、「並列処理」とは直接は関係ないからです。

「並行処理」とは人間が見た時に同時に動作しているように見えれば良いという処理です。なので例えば処理 A と処理 B を互い違いに高速で切り替えてやって見せれば人間の目からは同時に動作しているように見えます。これが並行処理です。マルチスレッド、マルチプロセスも同様に処理の優先順位を決めて高速に切り替えることであたかも同時に処理が行われているように見えます。また、「同時に見えれば良い」と述べましたが、真に同時であっても構いません。

対して「並列処理」は真に同時に計算が行われなければいけません。なので CPU のコアが二つ以上なければ並列処理はできないということになります。また、一般に並列処理といった場合、計算の手順は同じだが計算するデータが異なるものを大量に計算する場合を指すことが多いです。GPU での計算なんかがそうですね。ですので並列計算といった概念はあまり馴染みのないものかもしれません。

さて、じゃあなぜスレッドをコア数を超えて増やして計算速度が向上するのか?という問に答えます。スレッドの動作イメージは「余った時間で処理を切り替えていく」といった形です。コア数に対してスレッドが多くても手の空いたコアにスレッドが割り当てられて計算が進みます。そしてそれは途中で止まるかもしれません。とにかくスレッドの数が多いほど同時に計算できる量が増えます。しかしこれも頭打ちがあって、スレッドを切り替える動作自体がネックになって次第に速度は伸び悩むでしょう。もしくはメモリが足りないとか。

並行・並列処理のパフォーマンス計測は非常に難しい分野ですので、本か何かで情報を入手してみるのが良いかと思われます。Haskellによる並列・並行プログラミングなんかはおすすめです。

投稿2020/12/11 16:23

A_kirisaki

総合スコア2853

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iMori

2020/12/11 16:59

丁寧で非常にわかりやすい解答ありがとうございます! おかげで疑問が解けました。
guest

0

CPUの論理コア数を少々超えたくらいまでは上がっても不思議はないですが、遥かに多いスレッド数まで速度が上がるというのはさすがにちょっと不自然ですね。

for(int i = 0; i < 10000; ++i) // 内部で1万ループする { ++num; } ``` この部分がおそらく普通のコンパイラなら消えて無くなるので、スレッドの生成だけを計測していることになりますので、それが問題なのではないかなと思います。

投稿2020/12/22 00:57

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問