並列プログラミングのエラー
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
です。
よろしくお願いします。
お礼
ありがとうございました。普通はインストールした時に吐き出されずどこかに格納されるものだったのでしょうか?吐き出された以上、もう捨ててしまってもウィルスバスターの動作に支障はないでしょうか?