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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

3回答

2270閲覧

スレッド

monamona154

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2016/07/19 08:23

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

C言語

1#include <stdio.h> 2#include <stdlib.h> 3#include <omp.h> 4 5#define THREAD_NUM 2 6 7struct task { 8 double start, end; 9 double sum; 10}; 11 12struct task tasks[THREAD_NUM]; 13 14double calc(long size) { 15 double start, sum; 16 long d; 17 int i; 18 19 omp_set_num_threads(THREAD_NUM); 20 21 // create tasks 22 start = 1; 23 d = size / THREAD_NUM; 24 for (i = 0; i < THREAD_NUM; ++i) { 25 tasks[i].start = start; 26 tasks[i].end = start + d - 1; 27 tasks[i].sum = 0; 28 //printf("%f %f\n", tasks[i].start, tasks[i].end); 29 30 start += d; 31 } 32 tasks[i - 1].end = size; 33 34#pragma omp parallel 35 { 36 const int tid = omp_get_thread_num(); 37 double s, n; 38 39 s = 0; 40 for (n = tasks[tid].start; n <= tasks[tid].end; ++n) 41 s += n; 42 tasks[tid].sum = s; 43 } 44 45 sum = 0; 46 for (i = 0; i < THREAD_NUM; ++i) { 47 //printf("%d %f\n", i, tasks[i].sum); 48 sum += tasks[i].sum; 49 } 50 printf("%f\n", sum); 51 52 return sum; 53} 54 55int main(int argc, char **argv) { 56 calc(10000000000); 57 58 exit(0); 59}

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

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

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

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

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

Mr_Roboto

2016/07/19 08:51

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

回答3

0

ベストアンサー

質問になってない。

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

投稿2016/07/19 21:50

episteme

総合スコア16614

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

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

monamona154

2016/07/20 00:10

すいません スレッドを4個や5個使ったプログラムのことです。 4個5個使ったときの処理時間などを知りたいのですが、どのように追加したかわからないので、教えてもらいたいということです。
episteme

2016/07/20 02:30

理解不能。 OpenMPは使えるコア数を基にスレッド数を善きに計らってくれるんじゃないんですか? てかそもそも スレッド数を意識したくないから OpenMP使うんじゃなくて?
yohhoy

2016/07/20 06:13

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

2016/07/20 12:01

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

2016/07/21 01:01 編集

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

0

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

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

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

投稿2016/07/19 08:39

Zuishin

総合スコア28656

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

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

0

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

C++

1#include <iostream> 2#include <tbb/tbb.h> 3 4int main() { 5 // 1+2+...+N を求める 6 const int N = 1000; 7 tbb::task_scheduler_init init(4); // 4-threads 8 9 int result = tbb::parallel_reduce( 10 tbb::blocked_range<int>(1,N+1), 11 0, 12 [](const tbb::blocked_range<int>& r, int init)->int { 13 for( int a = r.begin(); a != r.end(); ++a ) 14 init += a; 15 return init; 16 }, 17 []( int x, int y)->int { 18 return x+y; 19 } 20 ); 21 std::cout << result << std::endl; 22}

投稿2016/07/20 02:53

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問