「C-assign-2009-11-17」の編集履歴(バックアップ)一覧はこちら

C-assign-2009-11-17」(2009/11/20 (金) 19:46:01) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

*積分 #codehighlight(c){{ /* * int_seq.c * * compile: * gcc int_seq.c -lm * */ #include <pthread.h> #include <unistd.h> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <sys/time.h> typedef struct f_args { double (*f)(double); double dest; double a; double b; int N; } f_args, * f_args_t; void* integrate(void * _arg) { f_args_t arg = _arg; double (*f)(double) = arg->f; double a = arg->a; double b = arg->b; int N = ((f_args_t)_arg)->N; int i; double s = 0.0; for (i = 0; i < N; i++) { double x = a + (b - a) * i / N; double x_next = a + (b - a) * (i + 1) / N; double dx = x_next - x; s += f(x) * dx; } arg->dest = s; return _arg; } double cur_time() { struct timeval tp[1]; gettimeofday(tp, NULL); return tp->tv_usec * 1.0E-6 + tp->tv_sec; } int main() { //int n_threads = 2; //pthread_t *tids = (pthread_t *)malloc(sizeof(pthread_t *) * n_threads); //f_args *args = (f_args *)malloc(sizeof(f_args_t *) * n_threads); pthread_t tids[2]; double a = 0.0; double b = M_PI / 2.0; double t0 = cur_time(); //int N = 100000000; f_args args1 = {sin, 0.0, a, b/2, 50000000}; f_args args2 = {sin, 0.0, b/2, b, 50000000}; double s; pthread_create(&tids[0], NULL, integrate, &args1); pthread_create(&tids[1], NULL, integrate, &args2); pthread_join(tids[0], NULL); pthread_join(tids[1], NULL); s = args1.dest + args2.dest; double t1 = cur_time(); printf("\\int_[%f,%f] sin(x) dx = %f\n", a, b, s); printf("%.6f sec\n", t1 - t0); return 0; } }} *素数 #codehighlight(c){{ /* * prime_seq.c * * */ #include <stdio.h> #include <sys/time.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> typedef struct prime_task { int a; int b; } *prime_task_t; typedef struct f_args { prime_task_t task; int thread_id; } f_args, *f_args_t; volatile int task_counter = 0; volatile int primes_counter = 0; int n_prime_task = 100; pthread_mutex_t m; #undef DEBUG int check_prime(int n) { int d; for (d = 2; d * d <= n; d++) { if (n % d == 0) return 0; } #ifdef DEBUG printf("%d is prime\n", n); #endif return 1; } int check_primes(int a, int b) { int n; int s = 0; for (n = a; n < b; n++) { s += check_prime(n); } return s; } void* check_primes_th(void * _task) { prime_task_t task = ( (f_args_t)_task)->task; int a,b; while(1) { pthread_mutex_lock(&m); if(task_counter >= n_prime_task) break; a = task[task_counter].a; b = task[task_counter].b; ++task_counter; pthread_mutex_unlock(&m); #ifdef DEBUG printf("task : %d, thread : %d\n",task_counter-1, ( (f_args_t)_task)->thread_id); #endif primes_counter += check_primes(a,b); } pthread_mutex_unlock(&m); return NULL; } double cur_time() { struct timeval tp[1]; gettimeofday(tp, NULL); return tp->tv_usec * 1.0E-6 + tp->tv_sec; } int main() { int N = 10000000; pthread_t tids[2]; f_args args[2]; prime_task_t pt = (prime_task_t)malloc(sizeof(struct prime_task) * n_prime_task); int t; for(t=0; t < n_prime_task; ++t) { pt[t].a = (N-1)* t /n_prime_task + 2; pt[t].b = (N-1)*(t+1)/n_prime_task + 1; } pthread_mutex_init(&m, NULL); args[0].task = args[1].task = pt; args[0].thread_id = 1; args[1].thread_id = 2; double t0 = cur_time(); pthread_create(&tids[0], NULL, check_primes_th, &args[0]); pthread_create(&tids[1], NULL, check_primes_th, &args[1]); pthread_join(tids[0], NULL); pthread_join(tids[1], NULL); double t1 = cur_time(); printf("%d primes in %f sec\n", primes_counter, t1 - t0); return 0; } }}
*積分 #codehighlight(c){{ /* * int_seq.c * * compile: * gcc int_seq.c -lm * */ #include <pthread.h> #include <unistd.h> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <sys/time.h> typedef struct f_args { double (*f)(double); double dest; double a; double b; int N; } f_args, * f_args_t; void* integrate(void * _arg) { f_args_t arg = _arg; double (*f)(double) = arg->f; double a = arg->a; double b = arg->b; int N = ((f_args_t)_arg)->N; int i; double s = 0.0; for (i = 0; i < N; i++) { double x = a + (b - a) * i / N; double x_next = a + (b - a) * (i + 1) / N; double dx = x_next - x; s += f(x) * dx; } arg->dest = s; return _arg; } double cur_time() { struct timeval tp[1]; gettimeofday(tp, NULL); return tp->tv_usec * 1.0E-6 + tp->tv_sec; } int main() { //int n_threads = 2; //pthread_t *tids = (pthread_t *)malloc(sizeof(pthread_t *) * n_threads); //f_args *args = (f_args *)malloc(sizeof(f_args_t *) * n_threads); pthread_t tids[2]; double a = 0.0; double b = M_PI / 2.0; double t0 = cur_time(); //int N = 100000000; f_args args1 = {sin, 0.0, a, b/2, 50000000}; f_args args2 = {sin, 0.0, b/2, b, 50000000}; double s; pthread_create(&tids[0], NULL, integrate, &args1); pthread_create(&tids[1], NULL, integrate, &args2); pthread_join(tids[0], NULL); pthread_join(tids[1], NULL); s = args1.dest + args2.dest; double t1 = cur_time(); printf("\\int_[%f,%f] sin(x) dx = %f\n", a, b, s); printf("%.6f sec\n", t1 - t0); return 0; } }} *素数 **C言語版 #codehighlight(c){{ /* * prime_seq.c * * */ #include <stdio.h> #include <sys/time.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> typedef struct prime_task { int a; int b; } *prime_task_t; typedef struct f_args { prime_task_t task; int thread_id; } f_args, *f_args_t; volatile int task_counter = 0; volatile int primes_counter = 0; int n_prime_task = 100; pthread_mutex_t m; #undef DEBUG int check_prime(int n) { int d; for (d = 2; d * d <= n; d++) { if (n % d == 0) return 0; } #ifdef DEBUG printf("%d is prime\n", n); #endif return 1; } int check_primes(int a, int b) { int n; int s = 0; for (n = a; n < b; n++) { s += check_prime(n); } return s; } void* check_primes_th(void * _task) { prime_task_t task = ( (f_args_t)_task)->task; int a,b; while(1) { pthread_mutex_lock(&m); if(task_counter >= n_prime_task) break; a = task[task_counter].a; b = task[task_counter].b; ++task_counter; pthread_mutex_unlock(&m); #ifdef DEBUG printf("task : %d, thread : %d\n",task_counter-1, ( (f_args_t)_task)->thread_id); #endif primes_counter += check_primes(a,b); } pthread_mutex_unlock(&m); return NULL; } double cur_time() { struct timeval tp[1]; gettimeofday(tp, NULL); return tp->tv_usec * 1.0E-6 + tp->tv_sec; } int main() { int N = 10000000; pthread_t tids[2]; f_args args[2]; prime_task_t pt = (prime_task_t)malloc(sizeof(struct prime_task) * n_prime_task); int t; for(t=0; t < n_prime_task; ++t) { pt[t].a = (N-1)* t /n_prime_task + 2; pt[t].b = (N-1)*(t+1)/n_prime_task + 1; } pthread_mutex_init(&m, NULL); args[0].task = args[1].task = pt; args[0].thread_id = 1; args[1].thread_id = 2; double t0 = cur_time(); pthread_create(&tids[0], NULL, check_primes_th, &args[0]); pthread_create(&tids[1], NULL, check_primes_th, &args[1]); pthread_join(tids[0], NULL); pthread_join(tids[1], NULL); double t1 = cur_time(); printf("%d primes in %f sec\n", primes_counter, t1 - t0); return 0; } }} **C++に書き換え #codehighlight(c++){{ //#define DEBUG // デバッグ用画面出力の制御 #include <cstdio> #include <sys/time.h> #include <deque> #include <vector> #include <pthread.h> #include <unistd.h> inline double cur_time() { struct timeval tp[1]; gettimeofday(tp, NULL); return tp->tv_usec * 1.0E-6 + tp->tv_sec; } struct PrimeTask { int a, b; PrimeTask(int a, int b) : a(a), b(b){}; }; extern "C" { typedef void* (*thread_run_t)(void*); }; class CheckPrimes { private: unsigned int n_thread; unsigned int n_task; pthread_mutex_t m; volatile int primes_counter; std::deque<PrimeTask> task; static int check_prime(int n) { for (int d = 2; d * d <= n; d++) { if (n % d == 0) return 0; } return 1; }; static int check_primes(int a, int b) { int n; int s = 0; for (n = a; n < b; n++) { s += check_prime(n); } return s; }; void check_primes_th() { int a,b; while(1) { pthread_mutex_lock(&m); if(task.empty()) break; a = task.back().a; b = task.back().b; task.pop_back(); pthread_mutex_unlock(&m); int x = check_primes(a,b); primes_counter += x; #ifdef DEBUG pthread_t xtid = pthread_self(); printf("task left : %d, thread : %#x, [%d,%d], detected : %6d, total : %6d\n", task.size(), (unsigned int)xtid, a, b, x, primes_counter); #endif } pthread_mutex_unlock(&m); }; static void run(void * pParam) { CheckPrimes *pCheckPrimes = (CheckPrimes *)pParam; pCheckPrimes->check_primes_th(); }; public: CheckPrimes(unsigned int threads, unsigned int tasks) : n_thread(threads), n_task(tasks), primes_counter(0) { pthread_mutex_init(&m, NULL); }; int operator()(int Nmax) { std::vector<pthread_t> tid; tid.resize(n_thread); task.clear(); primes_counter = 0; for(unsigned int t=0; t < n_task; ++t) task.push_back(PrimeTask((Nmax-1)* t /n_task + 2, (Nmax-1)*(t+1)/n_task + 1) ); for(std::vector<pthread_t>::iterator it=tid.begin(); it != tid.end(); ++it) pthread_create(&(*it), NULL, (thread_run_t)CheckPrimes::run, this); for(std::vector<pthread_t>::iterator it=tid.begin(); it != tid.end(); ++it) pthread_join(*it, NULL); return primes_counter; }; }; int main() { int N = 10000000; double t0 = cur_time(); int primes = CheckPrimes(2, 100)(N); double t1 = cur_time(); printf("%d primes in %f sec\n", primes, t1 - t0); return 0; } }}

表示オプション

横に並べて表示:
変化行の前後のみ表示:
目安箱バナー