几乎相同的功能,但只有一些会出现除以 0 的错误
Near identical functions, yet only some give divide by 0 errors
被赋予了一个函数来进行简单的矩阵-矩阵元素划分。但是,运行 int8 和 int16 版本 return 来自 valgrind 的整数除以 0 错误,以及来自命令行的段错误。 int32、spfp 和 dpfp 函数,我确保它们除了类型声明之外是相同的文本,没有这个问题。矩阵中的值是使用 rand() 函数随机生成的。为什么只有其中一些 return 除以 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);
}
如果 B[i]
永远为 0,您将遇到被零除的问题。 rand()
可以 return 0.
所以有时候B[i]=rand();
会把0赋值给B[i]
。
如评论中所述,这在位数较少的情况下更常见,因为 0 更可能是 rand()
操作的结果。
被赋予了一个函数来进行简单的矩阵-矩阵元素划分。但是,运行 int8 和 int16 版本 return 来自 valgrind 的整数除以 0 错误,以及来自命令行的段错误。 int32、spfp 和 dpfp 函数,我确保它们除了类型声明之外是相同的文本,没有这个问题。矩阵中的值是使用 rand() 函数随机生成的。为什么只有其中一些 return 除以 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);
}
如果 B[i]
永远为 0,您将遇到被零除的问题。 rand()
可以 return 0.
所以有时候B[i]=rand();
会把0赋值给B[i]
。
如评论中所述,这在位数较少的情况下更常见,因为 0 更可能是 rand()
操作的结果。