SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

連載記事

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

翔泳社では、「独習」「徹底入門」「スラスラわかる」「絵で見てわかる」「一年生」などの人気シリーズをはじめ、言語や開発手法、最新技術を解説した書籍を多数手がけています。プロジェクトマネジメントやチームビルティングといった管理職向けの書籍も豊富です。

ITエンジニアとしてのスキルアップ・リスキリングに、ぜひお役立てください。

書籍に関する記事を見る

'); googletag.cmd.push(function() { googletag.pubads().addEventListener('slotRenderEnded', function(e) { var ad_id = e.slot.getSlotElementId(); if (ad_id == 'div-gpt-ad-1659428980688-0') { var ad = $('#'+ad_id).find('iframe'); if ($(ad).width() == 728) { var ww = $(window).width(); ww = ww*0.90; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/728+","+ww/728+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/728+","+ww/728+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/728+","+ww/728+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/728+","+ww/728+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(90*ww/728)+"px;width:"+728+"px;}", 0 ); } else { if ($(window).width() < 340) { var ww = $(window).width(); ww = ww*0.875; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/320+","+ww/320+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/320+","+ww/320+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/320+","+ww/320+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/320+","+ww/320+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(180*ww/320)+"px;width:"+320+"px;}", 0 ); } } } }); }); } else { document.write('
'); document.write('
'); }
基礎から学ぶOpenMP

OpenMPの実行時ライブラリと並列ループ

基礎から学ぶOpenMP 第2回


  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード サンプルファイル (4.3 MB)

 昨今マルチコアCPUは一般化し、並列化処理の重要度がどんどん高まってきました。そこで本連載では、一番効率化を要求されるC/C++プログラマーを対象としてOpenMPの基礎を紹介します。今回は並列プログラミングに役立つ実行時ライブラリの関数と並列ループについて解説します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 この連載は、OpenMPを通じて並列処理の考え方をお伝えすることを目的としています。マルチコアCPUが既に普及していますので、今後は並列プログラミングが一般的なものとなり、さまざまな技術が登場するでしょう。その時並列プログラミングの根底に流れる考え方を身に付けられていれば、比較的容易に新技術も習得することができるでしょう。

 今回は並列プログラミングに役立つ実行時ライブラリの関数と並列ループについて解説します。この連載で解説に使用するサンプルコードはあくまでもOpenMPの基礎を理解するためのものであり、実務でOpenMPを使用する際にはよく理解してから用途に適したプログラミングを行ってください。

対象読者

 筆者が想定している読者はCの基本的文法をマスターし、並列化プログラミングに興味を持っている方です。凝ったテクニックを極力さけ、基本的な文法さえ分かれば読めるように注意しますので、並列化に興味を持っている方はぜひこの連載に目を通してください。

必要な環境

 必要な環境については、第1回を参照してください。

 なお、この連載は基本的にWindows環境を想定して解説しますが、OpenMPそのものは他のOS上でも動作しますので、適宜読み替えて参考にしてください。

実行時ライブラリの概要

 OpenMPでは、コンパイラが実装しなければならないAPI(アプリケーションプログラムインタフェース)を実行時ライブラリとして定義しています。従って、OpenMPをサポートするコンパイラであれば、共通してライブラリを使用することができ、移植性が高いソフトウェアを実装する手助けとなります。そして、実行時ライブラリは並列プログラミングを支援するための便利な関数を定義しています。

 この連載では今後、OpenMPでの並列プログラミングを解説するために、並列処理に関連する情報を使用します。その情報は実行時ライブラリを使用することにより取得できますので、次項からよく使用する実行時ライブラリの関数について解説していきます。

 並列プログラミングに関する関数と聞けば難しく感じるかもしれませんが、実行時ライブラリの使い方は実際にプログラムを動作させると比較的簡単に理解できますので安心して読み進めてください。

スレッドに関する関数

 一番最初は、スレッドに関する情報を取得する実行時ライブラリの関数を解説します。並列プログラミングをする際には、スレッドに関する情報が取得できれば色々便利です。例えば、逐次プログラミングでは正常に動作しているプログラムが、OpenMPを適用した途端に予期しない処理結果を返すようになった時、どのスレッドが処理をしているのかや、動作しているスレッドの数が確認できればデバッグに役立ちます。

 まずは記事に添付されているサンプルコードのうち、get_num_threadsプロジェクトを見てください。

スレッドに関する情報を取得するプログラム
#include <stdio.h>
#include <omp.h>

int main()
{
    /* 逐次処理のスレッドに関する情報を表示 */
    printf("現在使用中のスレッド数は「%d」です。\n", omp_get_num_threads() );
    printf("使用可能なスレッド数は最大「%d」です。\n", omp_get_max_threads() );

    /* 並列処理を指定した時のスレッドに関する情報を表示 */
    #pragma omp parallel
    {
        #pragma omp single
        {
            printf("現在使用中のスレッド数は「%d」です。\n", omp_get_num_threads() );
            printf("使用可能なスレッド数は最大「%d」です。\n", omp_get_max_threads() );
        }
    }

    /* スレッド数と並列処理を指定した時のスレッドに関する情報を表示 */
    #pragma omp parallel num_threads(10)
    {
        #pragma omp single
        {
            printf("現在使用中のスレッド数は「%d」です。\n", omp_get_num_threads() );
            printf("使用可能なスレッド数は最大「%d」です。\n", omp_get_max_threads() );
        }
    }

    printf( "\n" );
    return 0;
}

 このサンプルプロジェクトは、omp_get_num_threads関数とomp_get_max_threads関数の使用法を示すものです。逐次処理をしている(parallelの指定をしていない)部分は、1つのスレッドしか使用しないのでomp_get_num_threads関数は必ず1を返します。一方、並列処理をした場合は、CPUの論理コア数と同じか、parallel構文などで指定した数と同じだけの数が返されます。そして、omp_get_max_threads関数は、必ずnthreads-var内部制御変数の値が返されます。num_threads指示句に指定された数は考慮されません。実際に実行して確認してみてください。

 指示句というのはOpenMPの用語で、例えば#pragma omp parallel num_threads(10)の場合#pragma omp parallelの部分を指示文とよび、後続のnum_threadsの部分を指示句と呼びます。

 なお、このサンプルコードで#pragma omp singleを指定している理由は、同じメッセージを何度も表示しないためです。single指示文がないと何度も同じメッセージが表示されることになります。single指示文をコメントアウトするなどして、一度試してみてください。

 以上でスレッド数に関する情報が取得することができましたが、個々のスレッドが識別できれば大変便利です。幸いOpenMPのスレッドには番号が付けられ、この番号を取得する関数omp_get_thread_numが実行時ライブラリに用意されています。

 サンプルプロジェクトomp_get_thread_numを用いて使用法を解説します。

スレッド番号を取得するプログラム
#include <stdio.h>
#include <omp.h>

int main()
{
    #pragma omp parallel
    printf("Hello, World (スレッド番号%d)\n", omp_get_thread_num() );
    printf( "\n" );
    return 0;
}

 このサンプルプロジェクトomp_get_thread_numを実行すると、複数のスレッドが動いていることと、そのスレッドの番号が確認できます。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
プロセッサ情報の取得

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
基礎から学ぶOpenMP連載記事一覧

もっと読む

この記事の著者

インドリ(インドリ)

分析・設計・実装なんでもありのフリーエンジニア。ブログ「無差別に技術をついばむ鳥(http://indori.blog32.fc2.com/)」の作者です。アドバイザーをしたり、システム開発したり、情報処理技術を研究したりと色々しています。座右の銘は温故知新で、新旧関係なく必要だと考えたものは全て学...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4786 2010/04/27 12:09
" ); }

おすすめ

アクセスランキング

  1. 1
    世界6000万ユーザーの「TimeTree」、サービスの未来を見据えて挑んだデータベース移行の舞台裏
  2. 2
    データサイエンス基礎を高校数学から復習しよう! D3.jsでデータを表現する
  3. 3
    macOS上のアプリケーションからChatGPTが呼び出せるように。各種IDEやターミナル、メモなどが対応
  4. 4
    「Tailwind CSS」の公式UIライブラリ「Tailwind UI」、サービス拡大を視野に「Tailwind Plus」へ名称変更
  5. 5
    フリーランスの4割近くが正社員への転向を検討。転向者の約6割はマネジメント職種の経験あり
  1. 6
    マイクロソフト、Visual Studio ProfessionalとEnterpriseのユーザーに、学習コンテンツ「Cloud Academy」を無料公開
  2. 7
    AIや統計の数式を解説する美少女VTuber「AIcia Solid Project」生みの親が語る、継続できるアウトプット活動とは?
  3. 8
    モバイル向けLinuxプラットフォーム「Ubuntu Touch」最新版のOTA-8がリリース
  4. 9
    「オブザーバー・パターン」 ~マンガでプログラミング用語解説
  5. 10
    さくらインターネット、キヤノンITソリューションズと開発した暗号化消去対応フォーム「Cipher-X」の提供を開始

アクセスランキング

  1. 1
    世界6000万ユーザーの「TimeTree」、サービスの未来を見据えて挑んだデータベース移行の舞台裏
  2. 2
    データサイエンス基礎を高校数学から復習しよう! D3.jsでデータを表現する
  3. 3
    macOS上のアプリケーションからChatGPTが呼び出せるように。各種IDEやターミナル、メモなどが対応
  4. 4
    「Tailwind CSS」の公式UIライブラリ「Tailwind UI」、サービス拡大を視野に「Tailwind Plus」へ名称変更
  5. 5
    フリーランスの4割近くが正社員への転向を検討。転向者の約6割はマネジメント職種の経験あり
  6. 6
    マイクロソフト、Visual Studio ProfessionalとEnterpriseのユーザーに、学習コンテンツ「Cloud Academy」を無料公開
  7. 7
    AIや統計の数式を解説する美少女VTuber「AIcia Solid Project」生みの親が語る、継続できるアウトプット活動とは?
  8. 8
    モバイル向けLinuxプラットフォーム「Ubuntu Touch」最新版のOTA-8がリリース
  9. 9
    「オブザーバー・パターン」 ~マンガでプログラミング用語解説
  10. 10
    さくらインターネット、キヤノンITソリューションズと開発した暗号化消去対応フォーム「Cipher-X」の提供を開始
  1. 1
    「オブザーバー・パターン」 ~マンガでプログラミング用語解説
  2. 2
    C# 13の新機能を理解する――暗黙的なインデックスアクセスとallows ref struct
  3. 3
    マイクロソフト、VSCodeの新機能「Copilot Next Edit Suggestions」のプレビュー版公開
  4. 4
    3/5まで書籍全文が無料公開 『Pythonで動かして学ぶ!Kaggleデータ分析入門』
  5. 5
    ITエンジニア本大賞2025、技術書部門とビジネス書部門の大賞が決定!
  6. 6
    世界6000万ユーザーの「TimeTree」、サービスの未来を見据えて挑んだデータベース移行の舞台裏
  7. 7
    ITエンジニア本大賞2025のプレゼン大会をレポート、最終決戦に臨んだ本に込められた想いとは
  8. 8
    Linuxディストリビューション「EndeavourOS Mercury」が一般提供開始
  9. 9
    macOS上のアプリケーションからChatGPTが呼び出せるように。各種IDEやターミナル、メモなどが対応
  10. 10
    データサイエンス基礎を高校数学から復習しよう! D3.jsでデータを表現する

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

メールバックナンバー

アクセスランキング

  1. 1
    世界6000万ユーザーの「TimeTree」、サービスの未来を見据えて挑んだデータベース移行の舞台裏
  2. 2
    データサイエンス基礎を高校数学から復習しよう! D3.jsでデータを表現する
  3. 3
    macOS上のアプリケーションからChatGPTが呼び出せるように。各種IDEやターミナル、メモなどが対応
  4. 4
    「Tailwind CSS」の公式UIライブラリ「Tailwind UI」、サービス拡大を視野に「Tailwind Plus」へ名称変更
  5. 5
    フリーランスの4割近くが正社員への転向を検討。転向者の約6割はマネジメント職種の経験あり
  1. 6
    マイクロソフト、Visual Studio ProfessionalとEnterpriseのユーザーに、学習コンテンツ「Cloud Academy」を無料公開
  2. 7
    AIや統計の数式を解説する美少女VTuber「AIcia Solid Project」生みの親が語る、継続できるアウトプット活動とは?
  3. 8
    モバイル向けLinuxプラットフォーム「Ubuntu Touch」最新版のOTA-8がリリース
  4. 9
    「オブザーバー・パターン」 ~マンガでプログラミング用語解説
  5. 10
    さくらインターネット、キヤノンITソリューションズと開発した暗号化消去対応フォーム「Cipher-X」の提供を開始

アクセスランキング

  1. 1
    世界6000万ユーザーの「TimeTree」、サービスの未来を見据えて挑んだデータベース移行の舞台裏
  2. 2
    データサイエンス基礎を高校数学から復習しよう! D3.jsでデータを表現する
  3. 3
    macOS上のアプリケーションからChatGPTが呼び出せるように。各種IDEやターミナル、メモなどが対応
  4. 4
    「Tailwind CSS」の公式UIライブラリ「Tailwind UI」、サービス拡大を視野に「Tailwind Plus」へ名称変更
  5. 5
    フリーランスの4割近くが正社員への転向を検討。転向者の約6割はマネジメント職種の経験あり
  6. 6
    マイクロソフト、Visual Studio ProfessionalとEnterpriseのユーザーに、学習コンテンツ「Cloud Academy」を無料公開
  7. 7
    AIや統計の数式を解説する美少女VTuber「AIcia Solid Project」生みの親が語る、継続できるアウトプット活動とは?
  8. 8
    モバイル向けLinuxプラットフォーム「Ubuntu Touch」最新版のOTA-8がリリース
  9. 9
    「オブザーバー・パターン」 ~マンガでプログラミング用語解説
  10. 10
    さくらインターネット、キヤノンITソリューションズと開発した暗号化消去対応フォーム「Cipher-X」の提供を開始
  1. 1
    「オブザーバー・パターン」 ~マンガでプログラミング用語解説
  2. 2
    C# 13の新機能を理解する――暗黙的なインデックスアクセスとallows ref struct
  3. 3
    マイクロソフト、VSCodeの新機能「Copilot Next Edit Suggestions」のプレビュー版公開
  4. 4
    3/5まで書籍全文が無料公開 『Pythonで動かして学ぶ!Kaggleデータ分析入門』
  5. 5
    ITエンジニア本大賞2025、技術書部門とビジネス書部門の大賞が決定!
  6. 6
    世界6000万ユーザーの「TimeTree」、サービスの未来を見据えて挑んだデータベース移行の舞台裏
  7. 7
    ITエンジニア本大賞2025のプレゼン大会をレポート、最終決戦に臨んだ本に込められた想いとは
  8. 8
    Linuxディストリビューション「EndeavourOS Mercury」が一般提供開始
  9. 9
    macOS上のアプリケーションからChatGPTが呼び出せるように。各種IDEやターミナル、メモなどが対応
  10. 10
    データサイエンス基礎を高校数学から復習しよう! D3.jsでデータを表現する