こんにちは私は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
あなたのスレッドが完了するのを待つことはありません(これは 'pthread_join'で行うべきです)。また、' foo'は 'pthread_exit'をなぜ行うのですか? – Art