2015-09-17 3 views
3

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

}

+2

Не могли бы вы показать какой-нибудь код, пожалуйста? –

+3

Не могли бы вы указать код [_minimal_] (https://stackoverflow.com/help/mcve), пожалуйста? – edmz

ответ

8

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

Поэтому иногда B[i]=rand(); присваивает 0 B[i].

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

+0

Но это не объясняет, почему реализация int32 никогда не возвращает эту ошибку. – Spence123

+5

Никогда не долго. При низком разрешении (8 бит) я ожидаю, что 0 станет легче, чем с более высоким разрешением. Если вы запустите свою 32-битную версию достаточно часто, без повторения, вы, скорее всего, получите нуль от функции 'rand()', затем разделите ее на 0. – donjuedo

+2

Jup, 1 из 256 - приличные коэффициенты, 1 в 2.147.483.647. .. не так много –