2017-12-01 10 views
0

私はスレッドで新しく、4つのスレッドがグローバル配列の値を使っていくつかの並列計算を行うプログラムを作成しようとしています。しかし、スレッドがデータを順番にロードしていないという問題。スレッドが配列からデータをランダムにロードするのはなぜですか?

#define QUARTER 64 
#define RANGE_STEP 256 

struct thread_data 
{ 
    unsigned   start; 
    unsigned   stop; 
    __m256*   re_fc; 
    __m256*   im_fc; 
}; 

#define   NUM_THREADS     4 
struct   thread_data     thread_data_array[NUM_THREADS]; 

void *routine(void *thread_info) 
{ 
    int n,t; 
    unsigned t_start,t_stop; 
    __m256 *Re_fac , *Im_fac; 
    struct thread_data *mydata; 
    mydata = (struct thread_data*) thread_info; 
    t_start = mydata->start; 
    t_stop = mydata->stop; 
    Re_fac  = mydata->re_fc; 
    Im_fac  = mydata->im_fc; 

    t = t_start; 
    for (n = t_start; n < t_stop; n += 8) 
    { 
    // computations 
    RE_m256_fac = Re_fac[t]; 
    IM_m256_fac = Im_fac[t]; 
    // computations 
    t++; 
    } 
    pthread_exit(NULL); 
} 

int main() 
{ 
    unsigned t,i=0; 
    for(t=0;t<RANGE_STEP;t+=QUARTER) 
    { 
    thread_data_array[i].start  = t; 
    thread_data_array[i].stop  = t+QUARTER; 
    thread_data_array[i].re_fc  = RE_factors; 
    thread_data_array[i].im_fc  = IM_factors; 
    pthread_create(&threads[i],NULL,routine,(void *)&thread_data_array[i]); 
    i++; 
    } 
    for(i=0; i<NUM_THREADS; i++) 
    { 
    int rc = pthread_join(threads[i], NULL); 
    if (rc) 
    { 
     fprintf(stderr, "failed to join thread #%u - %s\n",i, strerror(rc)); 
    } 
    } 
} 

私が話しています問題は、まさにこの2つのロード命令RE_m256_fac = Re_fac[t];IM_m256_fac = Im_fac[t];ロードされたデータが正しくないとfor()ループ内のスレッドのルーチンで発生している...私は、インデックスtがあると思いますシンクロが必要ないローカル変数、または私は間違っていますか?

+1

'thread_data_array'とは何ですか? – yano

+1

't'はローカル変数かもしれませんが、インデックスに使用されている配列' thread_data_array'はスレッド間で明確に共有されています。どのように構築されているかを表示し、 'routine()'の中のforループが正しいことを確認してください。 – bnaecker

+0

'thread_data'型の' thread_data_array'は、各スレッドの引数をパススルーするために使用され、グローバルに宣言されています(構造体宣言の後にコードを編集してください)。そして、私は**ルーチン**内の 'for()'ループを二重チェックし、期待通りに動作しています。 –

答えて

0

私はそうと相互排他を防ぐために、ミューテックス・メカニズムを使用する必要がグローバル共有配列から読んでいますので、いくつかはそれはということになっ掘削後:

void *routine(void *thread_info) 
{ 
    int n,t; 
    unsigned t_start,t_stop; 
__m256 *Re_fac , *Im_fac; 
struct thread_data *mydata; 
mydata = (struct thread_data*) thread_info; 
t_start = mydata->start; 
t_stop = mydata->stop; 
Re_fac  = mydata->re_fc; 
Im_fac  = mydata->im_fc; 

t = t_start; 
for (n = t_start; n < t_stop; n += 8) 
{ 
    pthread_mutex_lock(&mutex); 
    // computations 
    RE_m256_fac = Re_fac[t]; 
    IM_m256_fac = Im_fac[t]; 
    // computations 
    pthread_mutex_unlock(&mutex); 
    t++; 
} 
pthread_exit(NULL); 
} 

、それ以来、私は見ることができますスレッドが共有配列から値を正しくロードしていることを確認します。

関連する問題