SHOEISHA iD

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

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

基礎から学ぶOpenMP

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

基礎から学ぶOpenMP 第2回


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

プロセッサ情報の取得

 スケーラブルな並列処理を実装する時、プログラムで利用可能なプロセッサ数が取得できれば便利です。実行時ライブラリomp_get_num_procsを使用すればそれが可能です。ただし、注意するべき点があります。それは、ハードアフィニティの機能との関係です。

 Windowsには、特定のプロセスやスレッドを特定のCPUで実行するように指定する機能があります。それをハードアフィニティと呼びます。指定しない場合は、WindowsがどのCPUで実行するのかを決定します。こちらの方はソフトアフィニティと呼びます。

 OpenMPを使用してもハードアフィニティを使う機会があると考え、その時実行時ライブラリがどのように動作するのか実験しました。

ハードアフィニティの設定と使用できるCPUの数を取得するサンプル
#include <stdio.h>
#include <omp.h>
#include <Windows.h>
#include <process.h>

int main(void) 
{
    PDWORD_PTR processMask, systemMask;
    HANDLE processID;

    /* プログラムで使用可能なプロセッサ数を取得 */
    printf( "現時点で利用可能なプロセッサ数は%dです。\n", omp_get_num_procs() );
    printf("\n");

    /* 現在のアフィニティマスクを取得 */
    processID = GetCurrentProcess();
    GetProcessAffinityMask( processID, &processMask, &systemMask );
    printf( "現時点のプロセスアフィニティマスクは%d, システムアフィニティマスクは%dです。\n", 
        processMask, systemMask);

    /* 現在のアフィニティマスクを変更 */
    SetProcessAffinityMask( processID, 1 );
    printf( "ハードアフィニティでCPU0のみ実行可能に変更しました。\n" );
    GetProcessAffinityMask( processID, &processMask, &systemMask );
    printf( "現時点のプロセスアフィニティマスクは%d, システムアフィニティマスクは%dです。\n", 
        processMask, systemMask);
    printf("\n");

    /* プログラムで使用可能なプロセッサ数を取得 */
    printf( "現時点で利用可能なプロセッサ数は%dです。\n", omp_get_num_procs() );
    printf( "\n\n\n" );
    return 0;
}

 このプログラムを使用して実行したところ、残念ながらハードアフィニティを設定してもomp_get_num_procs関数が返す値は変化しませんでした。ハードアフィニティを指定するプログラムを書くときにこの点に注意してください。しかしながら、将来この関数の動作は変更されるかもしれませんので十分に注意してください。

次のページ
並列情報の取得

修正履歴

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

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

もっと読む

この記事の著者

インドリ(インドリ)

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング