並列プログラミングのエラー
6400×6400の行列のベクトル積を並列計算によって求め、その時間を計るプログラムです。
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <pthread.h>
#define MATRIX 6400
#define THREAD 2
#define COUNT 30
#define SPLIT 100
int INDEX = 0;
double a[MATRIX * MATRIX], b[MATRIX], x[MATRIX];
pthread_mutex_t m1;
double gettimeofday_sec()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec + (double)tv.tv_usec*1e-6;
}
void thread_func(void *arg)
{
int i, j, tmp;
while(INDEX < MATRIX) {
pthread_mutex_lock(&m1);
tmp = INDEX;
INDEX += SPLIT;
pthread_mutex_unlock(&m1);
for(i = tmp; i < tmp + SPLIT; i++) {
for(j = 0; j < MATRIX; j++) {
b[i] += a[i * MATRIX + j] * x[j];
}
}
}
}
int main()
{
int i, j;
double timeA, timeB;
pthread_t handle[THREAD];
pthread_mutex_init(&m1, NULL);
for(i = 0; i < MATRIX * MATRIX; i++) a[i] = rand() % 10;
for(i = 0; i < MATRIX; i++) x[i] = rand() % 10;
timeA = gettimeofday_sec(); //計測開始
for(i = 0; i < COUNT; i++) {
for(j = 0; j < THREAD; i++) pthread_create(&handle[i], NULL, (void *)thread_func, NULL);
for(j = 0; j < THREAD; i++) pthread_join(handle[i], NULL);
INDEX = 0;
}
timeB = gettimeofday_sec(); //計測終了
printf("計算時間:%d\n", timeB - timeA);
return 0;
}
cygwinでコンパイル、実行すると
Exception: STATUS_ACCESS_VIOLATION at eip=00401276
eax=000018D0 ebx=000018FF ecx=00000003 edx=0022CE64 esi=611021A0 edi=004015E8
ebp=0022CCE8 esp=0022CC90 program=C:\cygwin\home\管理者\a.exe, pid 2020, thread main
cs=001B ds=0023 es=0023 fs=003B gs=0000 ss=0023
Stack trace:
Frame Function Args
0022CCE8 00401276 (00000001, 6116B690, 13F40090, 0022CC70)
0022CD98 610060D8 (00000000, 0022CDD0, 61005450, 0022CDD0)
61005450 61004416 (0000009C, A02404C7, E8611021, FFFFFF48)
7 [main] a 2020 _cygtls::handle_exceptions: Error while dumping state (probably corrupted stack)
という内容のstackdumpファイルが生成されて実行できません。
どのように修正すればうまく実行できるでしょうか?
環境は
OS:WindowsXP SP3
CPU:Intel(R) Core(TM)2 Duo E4500 @2.20GHz
RAM:2048MB
です。
よろしくお願いします。
お礼
すばやい回答ありがとうございました。 まだ、解決していないのでどうしようもないものなんですね。 それだけでもわかってよかったです。 本当にありがとうございました。