質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

90.04%

スレッド

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 828

monamona154

score 11

以下のC言語のプログラムをスレッドを複数使用して処理するようにしてもらいたいです。
スレッドが1つの時と複数使用した時との時間をtime関数で計測したいとも思っています。
参考サイトなどでもいいので教えてもらいたいです。
回答お願いします。linuxを使用しています。

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>

#define THREAD_NUM 2

struct task {
    double start, end;
    double sum; 
};

struct task tasks[THREAD_NUM];

double calc(long size) {
    double start, sum;
    long d;
    int i;

    omp_set_num_threads(THREAD_NUM);

    // create tasks
    start = 1;
    d = size / THREAD_NUM;
    for (i = 0; i < THREAD_NUM; ++i) {
    tasks[i].start = start;
    tasks[i].end = start + d - 1;
    tasks[i].sum = 0;
    //printf("%f %f\n", tasks[i].start, tasks[i].end);

    start += d;
    }
    tasks[i - 1].end = size;

#pragma omp parallel
    {
    const int tid = omp_get_thread_num();
    double s, n;

    s = 0;
    for (n = tasks[tid].start; n <= tasks[tid].end; ++n)
        s += n;
    tasks[tid].sum = s;
    }

    sum = 0;
    for (i = 0; i < THREAD_NUM; ++i) {
    //printf("%d %f\n", i, tasks[i].sum);
    sum += tasks[i].sum;
    }
    printf("%f\n", sum);

    return sum;
}

int main(int argc, char **argv) {
    calc(10000000000);

    exit(0);
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Mr_Roboto

    2016/07/19 17:51

    早速下げられてますが、 「もらいたい」って表現は、ちょっとどうかと思います ^_^; 回答者は、召使じゃないんだからねと。 他の質問も下げられてるし、解決もしていないので、きちんと解決済みにしてから次の質問するようにしないとだんだんと居づらくなると思いますよ。

    キャンセル

  • 退会済みユーザー

    2016/07/20 15:10

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 3

checkベストアンサー

+1

質問になってない。

  • 「以下のC言語のプログラム」は、要するに何を求めてるんですか?
  • OpenMP使ってますよね? 「スレッドを複数使用して処理」してるんじゃないんですか?
  • つまり何が問題なんですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/20 15:13

    omp_set_num_threads(THREAD_NUM);しているので#define THREAD_NUM 4とかに変えれば良さそうですね。

    キャンセル

  • 2016/07/20 21:01

    いやそうだろうけど OpenMPでタスクをthread数で分割するよなコード書かにゃならんとは思えんのですよね。

    キャンセル

  • 2016/07/20 23:30 編集

    アプリケーション領域にもよるでしょうけど、OpenMPが提供する抽象化度合いはさほど高くないのでスレッド数を明示制御するようなコードも存在はしますね。(taskが導入されたのもOpenMP 3以降ですし)

    キャンセル

+1

探せばそれこそいくらでも出てきますが、あまり文章量のあるところだと受け付けないでしょう。

C言語でのスレッド処理
ここはスレッドの基本と短いサンプル二本だけです。
処理を追って自分のものにしてください。

経験上、初心者時代は他人のプログラムを読んだだけでは使えるようにはなりません。
処理が理解できたら、サンプルを見ずに同じものを作ってみてください。
理解したつもりのものがいかに理解できていなかったか思い知ることと思います。
そしてそれが力になって応用がきくようになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

C はメンドクセーので C++ で実装。
pthread もメンドクセーので Intel TBB 使った。

#include <iostream>
#include <tbb/tbb.h>

int main() {
  // 1+2+...+N を求める
  const int N = 1000;
  tbb::task_scheduler_init init(4); // 4-threads

  int result = tbb::parallel_reduce( 
    tbb::blocked_range<int>(1,N+1), 
    0,
    [](const tbb::blocked_range<int>& r, int init)->int {
      for( int a = r.begin(); a != r.end(); ++a )
        init += a;
      return init;
    },
    []( int x, int y)->int {
      return x+y;
    }
  );
  std::cout << result << std::endl;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る