C 线程内错误的数组读取
我有一个多线程C程序,其中有4个线程使用一些全局数组进行算术计算。下面是代码的示例C 线程内错误的数组读取,c,arrays,multithreading,C,Arrays,Multithreading,我有一个多线程C程序,其中有4个线程使用一些全局数组进行算术计算。下面是代码的示例 __m256 *array_1; __m256 *array_2; __m256 *array_3; #define ALIGNMENT 32 #define SIMD_STEP 8 void Init_arrays() { int i; posix_memalign((void**) &array_1, ALIGNMENT, 32*sizeof(__m256)); posix_mem
__m256 *array_1;
__m256 *array_2;
__m256 *array_3;
#define ALIGNMENT 32
#define SIMD_STEP 8
void Init_arrays()
{
int i;
posix_memalign((void**) &array_1, ALIGNMENT, 32*sizeof(__m256));
posix_memalign((void**) &array_2, ALIGNMENT, 4 *sizeof(__m256));
posix_memalign((void**) &array_3, ALIGNMENT, 2 *sizeof(__m256));
for(i=0;i < 256; i+= SIMD_STEP)
{
// Filling array for the 1st stage
}
for(i=0;i < 64; i+= SIMD_STEP)
{
// Filling array for the 2nd stage
}
for(i=0;i < 16; i+= SIMD_STEP)
{
// Filling array for the 3rd stage
}
}
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]) );
T_fac1 = array_1[n];
T_fac2 = array_2[n];
T_fac3 = array_3[n];
// print data 'printf()'
// further computations
_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) );
}
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++;
}
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));
}
}
}
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
Init_arrays();
// print data 'printf()'
foo(data1,data2);
return EXIT_SUCCESS;
}
有人知道这个错误结果背后的原因吗
__m256 *array_1;
__m256 *array_2;
__m256 *array_3;
#define ALIGNMENT 32
#define SIMD_STEP 8
void Init_arrays()
{
int i;
posix_memalign((void**) &array_1, ALIGNMENT, 32*sizeof(__m256));
posix_memalign((void**) &array_2, ALIGNMENT, 4 *sizeof(__m256));
posix_memalign((void**) &array_3, ALIGNMENT, 2 *sizeof(__m256));
.
.
.
此循环引用超出范围的数组元素:
for (n = t_start; n < t_stop; n += 8)
{
.
.
.
T_fac1 = array_1[n];
T_fac2 = array_2[n];
T_fac3 = array_3[n];
for(n=t\u开始;n
array\u 3
有两个成员:2*sizeof(\uuu m256)
但是索引增加了8?听起来你必须使用某种同步资源(例如互斥锁)。在你的代码中看不到这一点…你为什么要调用pthread\u exit
?似乎你忽略了有用的注释和答案?阅读pthread\u join
@PaulR:实际上没有,我使用了pthread\u join
,它已经正常工作了…但现在问题只是从array\u 1[]
您需要提供一个适当的、而不是近似的代码,然后继续编辑。标记代码示例、复制并粘贴到文件、运行编译器、未编译(更不用说重现问题)、失去兴趣、投票关闭。
for (n = t_start; n < t_stop; n += 8)
{
.
.
.
T_fac1 = array_1[n];
T_fac2 = array_2[n];
T_fac3 = array_3[n];