【发布时间】:2018-08-10 14:28:05
【问题描述】:
请看我下面的代码 sn-p(floatalloc2 用于分配数据类型为 float 的 2D 连续数组,如有兴趣请参阅附录):
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
int main(int argc, char *argv[])
{
float **p=NULL, **buffer=NULL;
int it, nt=3, i, j, k, NP, MYID, nx=1, nz=2, nsrc=3, isrc;
MPI_Init ( &argc, &argv );
MPI_Comm_size ( MPI_COMM_WORLD, &NP );
MPI_Comm_rank ( MPI_COMM_WORLD, &MYID );
p = floatalloc2(nx,nz);
memset(p[0],0,nz*nx*sizeof(float));
for (it=0; it<nt; it++){
for (isrc=MYID; isrc<nsrc; isrc+=NP){
for (j=0; j<nz; j++){
for (i=0; i<nx; i++){
p[j][i] += 1.5 + (float)(isrc) + (float)(j);
}
}
}
for (k=0;k<nsrc-1;k++){
if (MYID==k){
buffer = floatalloc2(nx,nz);
memset(buffer[0],0,nz*nx*sizeof(float));
buffer = p;
}else{
buffer = floatalloc2(nx,nz);
memset(buffer[0],0,nz*nx*sizeof(float));
}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Bcast(&buffer[0][0],nx*nz,MPI_FLOAT,k,MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
for (j=0; j<nz; j++){
for (i=0; i<nx; i++){
printf("it=%d,k=%d,Node %d,p[%d][%d]=%f\n",it,k,MYID,j,i,p[j][i]);
}
}
free(*buffer);free(buffer); /*w/o this line is ok while not ok with this line */
}
}
MPI_Finalize();
exit(0);
}
作为一个经验法则,C 会在分配内存后释放内存,即使在循环中也是如此。但是这里,如果我不加free(*buffer);free(buffer);,那就相当不错了。但是,如果使用free,则结果是错误的。那么我的代码有什么问题呢?
floatalloc2 的附录:
/*@out@*/ void *sf_alloc (size_t n, size_t size )
/*< output-checking allocation >*/
{
void *ptr;
size *= n;
if (0>=size) sf_error("%s: illegal allocation (%d bytes)",__FILE__,size);
ptr = malloc (size);
if (NULL == ptr)
sf_error ("%s: cannot allocate %lu bytes:", __FILE__,size);
return ptr;
}
/*@out@*/ float *sf_floatalloc (size_t n)
/*< float allocation >*/
{
float *ptr;
ptr = (float*) sf_alloc (n,sizeof(float));
return ptr;
}
/*@out@*/ float **floatalloc2 (size_t n1 , size_t n2 )
/*< float 2-D allocation, out[0] points to a contiguous array >*/
{
size_t i2;
float **ptr;
ptr = (float**) sf_alloc (n2,sizeof(float*));
ptr[0] = sf_floatalloc (n1*n2);
for (i2=1; i2 < n2; i2++) {
ptr[i2] = ptr[0]+i2*n1;
}
return ptr;
}
【问题讨论】:
-
提供
floatalloc2的库不提供floatunalloc2之类的东西吗?您的free调用很可能与内存分配不符。 -
@Bathsheba 我为
floatalloc2添加了一个附录 -
必须为您提供
freethis 的库函数。即使您设法复制它,也不能保证它可以在您使用的任何库的后续版本中工作。 -
由于您使用的是 MPI,您可能对高性能计算感兴趣。在这种情况下,您应该知道双重间接(
float **p,即p[row][column]指代一个元素,p和p[row]是指针)比使用带索引算术的线性数组(即@987654334)慢得多@ 和all[row*columns + column]指代一个元素,在当前架构上。这意味着这种方法永远不会像线性阵列那样有效。 -
@NominalAnimal 感谢您的评论。在当前阶段,我的目标是让代码正确运行。我会在下一阶段考虑效率。
标签: c pointers mpi free dynamic-memory-allocation