Почти идентичные функции, но только некоторые дают деление на 0 ошибок

Была дана функция делать простое матрично-матричное поэлементное деление. Тем не менее, при запуске версий int8 и int16 возвращается целочисленное деление на 0 ошибок из valgrind, а ошибки seg из командной строки. Функции int32, spfp и dpfp, которые, как я гарантировал, были одним и тем же текстом, кроме объявления типов, не имеют этой проблемы. Значения в матрице генерируются случайным образом с помощью функции rand(). Почему только некоторые из них возвращают деление на 0 ошибок?

Первая функция

double matrix_matrix_div_elementwise_int8(int size,int threads)
{
//initialize index variables, random number generator, and timer
int i;
int size2D=size*size;
srand(SEED);
struct TIME_STRUCT start,end;

//allocate memory for matrices
INT8_TYPE *A=malloc(sizeof(INT8_TYPE)*(size*size));
INT8_TYPE *B=malloc(sizeof(INT8_TYPE)*(size*size));
INT8_TYPE *C=malloc(sizeof(INT8_TYPE)*(size*size));

//initialize input matrices to random numbers
//initialize output matrix to zeros
for(i=0;i<(size*size);i++)
{
    A[i]=rand();
    B[i]=rand();
    C[i]=0;
}

//serial operation
if(threads==1)
{
    //start timer
    TIME_GET(&start);
    //computation
    for(i=0;i<size2D;i++)
    {
        C[i]=A[i]/B[i];
    }
    //end timer
    TIME_GET(&end);
}
//parallel operation
else
{
    //start timer
    TIME_GET(&start);
    //parallelize with OpenMP
    #pragma omp parallel for num_threads(threads) private(i)
    //computation
    for(i=0;i<size2D;i++)
    {
        C[i]=A[i]/B[i];
    }
    //end timer
    TIME_GET(&end);
}

//free memory
free(C);
free(B);
free(A);

return TIME_RUNTIME(start,end);
} 

Вторая функция

double matrix_matrix_div_elementwise_int32(int size,int threads)
{
//initialize index variables, random number generator, and timer
int i;
int size2D=size*size;
srand(SEED);
struct TIME_STRUCT start,end;

//allocate memory for matrices
INT32_TYPE *A=malloc(sizeof(INT32_TYPE)*(size*size));
INT32_TYPE *B=malloc(sizeof(INT32_TYPE)*(size*size));
INT32_TYPE *C=malloc(sizeof(INT32_TYPE)*(size*size));

//initialize input matrices to random numbers
//initialize output matrix to zeros
for(i=0;i<(size*size);i++)
{
    A[i]=rand();
    B[i]=rand();
    C[i]=0;
}

//serial operation
if(threads==1)
{
    //start timer
    TIME_GET(&start);
    //computation
    for(i=0;i<size2D;i++)
    {
        C[i]=A[i]/B[i];
    }
    //end timer
    TIME_GET(&end);
}
//parallel operation
else
{
    //start timer
    TIME_GET(&start);
    //parallelize with OpenMP
    #pragma omp parallel for num_threads(threads) private(i)
    //computation
    for(i=0;i<size2D;i++)
    {
        C[i]=A[i]/B[i];
    }
    //end timer
    TIME_GET(&end);
}

//free memory
free(C);
free(B);
free(A);

return TIME_RUNTIME(start,end);

}

1 ответ

Решение

Если B[i] когда-либо 0, вы получите проблему деления на ноль. rand() может вернуть 0.

Так иногда B[i]=rand(); назначит 0 для B[i],

Как указано в комментарии, это будет более распространенным с меньшим количеством битов, так как 0 является более вероятным результатом rand() операция.

Другие вопросы по тегам