トップ 一覧 置換 検索 ヘルプ RSS ログイン

C言語で並列処理の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!文字列を数字に
 atoi(char *)
を使う
http://www.atmarkit.co.jp/fcoding/articles/parallel/01/para01c.html

!数字を文字列に
 sprintf(buf, "%d", 100);
OpenMP で並列処理
 001: /*
 002:  * Array のインクリメント(OpenMP版)
 003:  */
 004: 
 005: #include<stdio.h>
 006: #include<stdlib.h>
 007: #include<omp.h>
 008: #define N 16
 009: 
 010: int main (int argc, char *argv[])
 011: {
 012:   int i;
 013:   int *rootBuf;
 014:   int num_of_threads;
 015: 
 016:   if(argc!=2){
 017:     printf("usage: a.out <number of threads>\n");
 018:     return(1);
 019:   }
 020: 
 021:   num_of_threads = atoi(argv[1]);
 022:   omp_set_num_threads(num_of_threads);
 023:   
 024:   rootBuf = (int *)malloc(N * sizeof(int));
 025: 
 026:   /* 配列Initialize */
 027:   for(i=0;i<N;i++){
 028:     rootBuf[i] = i;
 029:   }
 030: 
 031:   /* 並列処理の開始 */
 032: #pragma omp parallel
 033:   printf("Exec by thread 0 (total 0 threads)\n",omp_get_thread_num(), omp_get_num_threads());
 034: #pragma omp for
 035:   /* Incriment */
 036:   for (i = 0; i < N; i++) {
 037:     rootBuf[i] = rootBuf[i] + 1;
 038:   }
 039: 
 040:   /* 演算結果の出力 */
 041:   printf("\n");	 
 042:   for (i = 0; i < N; i++) printf("rootbuf[%d] = %d\n",i,rootBuf[i]);
 043:   
 044:   /* 終了処理 */
 045:   free(rootBuf);
 046: 
 047:   return(0);
 048: }

!現在の日付、時間
time() で 現在日付、時刻を取得し、localtime でtm構造体に入れる。
tm構造体
 struct tm {
   int tm_sec;      /* 秒 [0-61] 最大2秒までのうるう秒を考慮 */
   int tm_min;      /* 分 [0-59] */
   int tm_hour;     /* 時 [0-23] */
   int tm_mday;     /* 日 [1-31] */
   int tm_mon;      /* 月 [0-11] 0から始まることに注意 */
   int tm_year;     /* 年 [1900からの経過年数] */
   int tm_wday;     /* 曜日 [0:日 1:月 ... 6:土] */
   int tm_yday;     /* 年内の通し日数 [0-365] 0から始まることに注意*/
   int tm_isdst;    /* 夏時間が無効であれば 0 */
 };
使用例
 #include <time.h>
 
 int main(){
   struct tm *date;
   time_t now;
   int year, month, day;
   int hour, minute, second;
   
   /* 現在の日時を取得 */
   time(&now);
   date = localtime(&now);
   
   year = date->tm_year + 1900;
   month = date->tm_mon + 1;
   day = date->tm_mday;
   
   hour = date->tm_hour;
   minute = date->tm_min;
   second = date->tm_sec;
 
   printf("%04d/%02d/%02d %02d:%02d:%02d\n",
     year,
     month,
     day,
     hour,
     minute,
     second);
 }

!実行時間を測定
 #include <time.h>
 #include <sys/time.h>
 #include <stdio.h>
 
 double gettimeofday_sec()
 {
     struct timeval tv;
     gettimeofday(&tv, NULL);
     return tv.tv_sec + (double)tv.tv_usec*1e-6;
 }
 
 int main()
 {
     int i;
     int n = 0;
     double t1,t2;
 
     t1 = gettimeofday_sec();
     for (i = 0; i < 100000; i++)
         n *= i;
     t2 = gettimeofday_sec();
     printf("time = %10.30f\n", t2 - t1);
 
     t1 = gettimeofday_sec();
     for (i = 0; i < 10000000; i++)
         n *= i;
     t2 = gettimeofday_sec();
     printf("time = %10.30f\n", t2 - t1);
 }
コンパイル
 gcc -fopenmp list3.c
{{category2 プログラミング言語,C}}