2017-11-23 7 views
0

こんにちは私は4つのスレッドを使用してフロートの配列の計算を行うCでマルチスレッドプログラムを作成しようとしています。だから、私はちょうど4つのスレッドを作成し、スレッドが動作する配列のどの部分を定義するいくつかの引数で遊んで始めました。そして、その時点でプログラムは正常に動作しています。マルチスレッドプログラムがブロックされています

ここでは、ロードと格納の命令(インテル®インテリジェンス256ビット)のみを使用しようとしました。スレッドルーチンが作業を終えているようですが、プログラムは終了しません。

void *routine(void *thread_info) 
{ 
    int n; 
    unsigned t_start,t_stop; 
    unsigned ind1, ind2, ind3; 
    float *arr_in , *arr_out; 
    struct thread_data *mydata; 

    mydata = (struct thread_data*) thread_info; 
    t_start = mydata->start; 
    t_stop = mydata->stop; 
    arr_in = mydata->input; 
    arr_out = mydata->output; 

    for (n = t_start; n < t_stop; n += 8) 
    { 
     ind1 = 256 + n; 
     ind2 = 512 + n; 

     vec_a = _mm256_load_ps((float *) (&arr_in[n ])); 
     vec_b = _mm256_load_ps((float *) (&arr_in[ind1])); 
     vec_c = _mm256_load_ps((float *) (&arr_in[ind2])); 

     _mm256_store_ps((float *) (&arr_out[n ]), (vec_a)); 
     _mm256_store_ps((float *) (&arr_out[ind1]), (vec_b)); 
     _mm256_store_ps((float *) (&arr_out[ind2]), (vec_c)); 
    } 
    printf("EXECUTION FINISHED ===== Thread : %u \n",t_start); 
    pthread_exit(NULL); 
} 

void foo(float* in,float* out) 
{ 
    unsigned t,i=0; 
    for(t=0;t<256;t+=64) 
    { 
     thread_data_array[i].start = t; 
     thread_data_array[i].stop = t+QUARTER; 
     thread_data_array[i].input = in; 
     thread_data_array[i].output = out; 
     pthread_create(&threads[i],NULL,routine,(void*)&thread_data_array[i]); 
     i++; 
    } 
    pthread_exit(NULL); 
} 

int main() 
{ 
    float *data1; 
    float *data2; 

    posix_memalign((void**)&data1, 32, 1024 * sizeof(float)); 
    posix_memalign((void**)&data2, 32, 1024 * sizeof(float)); 

    Load_inputs(reals,imags);//load data into the two arrays 
    foo(data1,data2); 
    printf("PROGRAM EXECUTION FINISHED"); 
    return EXIT_SUCCESS; 
} 

コンパイルは、次の私に与えていないエラーが、実行良いです:

EXECUTION FINISHED ===== Thread : 0 
EXECUTION FINISHED ===== Thread : 64 
EXECUTION FINISHED ===== Thread : 128 
EXECUTION FINISHED ===== Thread : 192 

プログラムが終了し、まだあなたにはfoo機能をPROGRAM EXECUTION FINISHED

+0

あなたのスレッドが完了するのを待つことはありません(これは 'pthread_join'で行うべきです)。また、' foo'は 'pthread_exit'をなぜ行うのですか? – Art

答えて

5

が欠落していない、あなたはpthread_exit(NULL);を呼んでいます直ちにメインスレッドを終了します(fooはメインスレッドから呼び出されます)。これは、出力に "PROGRAM EXECUTION FINISHED"が表示されない理由です。メインスレッドは、fooで終了したため、印刷する機会は決してありません。あなたが代わりにやりたいのは、join the threads with pthread_joinです。これにより、メインスレッドは他のスレッドが終了するのを待ちます。

関連する問題