2013-03-27 81 views
4

是否openmp分配内存并释放所有内存?因为我跑了valgrind,并且释放了所有的名单。我所有的malloc,我都有空。确实openmp分配内存并释放后全部

==11442== HEAP SUMMARY: 
==11442==  in use at exit: 192 bytes in 1 blocks 
==11442== total heap usage: 2,001 allocs, 2,000 frees, 2,917,280 bytes allocated 
==11442== 
==11442== LEAK SUMMARY: 
==11442== definitely lost: 0 bytes in 0 blocks 
==11442== indirectly lost: 0 bytes in 0 blocks 
==11442==  possibly lost: 0 bytes in 0 blocks 
==11442== still reachable: 192 bytes in 1 blocks 
==11442==   suppressed: 0 bytes in 0 blocks 

如果不是为什么在一个块中仍然存在内存泄漏?

这是我的代码:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
/*check definition of _OPENMP*/ 
#ifdef _OPENMP 
#include <omp.h> 
#endif 

#define RMAX 10000000 

/*Global variables*/ 
int arraySizeGlobal; 
int numberOfthreads; 
int *aux; 

/*Functions*/ 
void sort(int *a); 
void sort2(int *a, int lo, int hi); 
void merge(int *a, int lo, int mid, int hi); 
void Generate_list(int a[], int n); 
void printlist(int *array); 

int main(int argc, char* argv[]) 
{ 
numberOfthreads = strtol(argv[1], NULL, 10); 
arraySizeGlobal = strtol(argv[2], NULL, 10); 
//////////////////////////////// 
int *array; 
array = malloc(arraySizeGlobal * sizeof(int)); 
Generate_list(array,arraySizeGlobal); 

printf("=====================\n"); 
printf("////Starting list////\n"); 
printf("=====================\n"); 
printlist(array); 

sort(array); 

printf("=====================\n"); 
printf("/////Sorted list/////\n"); 
printf("=====================\n"); 
printlist(array); 

free(array); 

return 0; 
} 

void sort(int *a) 
{ 
aux = malloc(arraySizeGlobal * sizeof(int)); // Allocate space just once. 
//#pragma omp parallel num_threads(numberOfthreads) 
//#pragma omp single nowait 
sort2(a, 0, arraySizeGlobal - 1); 
free(aux); 
} 
void sort2(int *a, int lo, int hi) 
{ // Sort a[lo..hi]. 
if (hi <= lo) return; 
int mid = lo + (hi - lo)/2; 
    #pragma omp parallel sections num_threads(numberOfthreads) 
    { 
    #pragma omp section 
    sort2(a, lo, mid); // Sort left half. 
    #pragma omp section 
    sort2(a, mid+1, hi); // Sort right half. 
    } 

merge(a, lo, mid, hi); // Merge 
} 
void merge(int *a, int lo, int mid, int hi) 
{ // Merge a[lo..mid] with a[mid+1..hi]. 
int i = lo, j = mid+1; 
int k; 
#pragma omp parallel for num_threads(numberOfthreads) 
for (k = lo; k <= hi; k++) // Copy a[lo..hi] to aux[lo..hi]. 
    aux[k] = a[k]; 
for (k = lo; k <= hi; k++) // Merge back to a[lo..hi]. 
    if (i > mid) a[k] = aux[j++]; 
    else if (j > hi) a[k] = aux[i++]; 
    else if (aux[j] < aux[i]) a[k] = aux[j++]; 
    else a[k] = aux[i++]; 
} 
void printlist(int *array) 
{ 
int i; 
for (i = 0; i < arraySizeGlobal; ++i) 
{ 
    printf("%d ", array[i]); 
} 
printf("\n"); 
} 
void Generate_list(int a[], int n) { 
int i; 
srandom(1); 
for (i = 0; i < n; i++) 
    a[i] = random() % RMAX; 
} /* Generate_list */ 

================================== ================================================

此代码:来自Algorithms FOURTH EDITION,Robert Sedgewick |凯文韦恩。 这是一个java实现,我更改为ac实现,并使用openmp瘫痪

============================= ================================================== ===

+2

重新运行的valgrind用'--leak检查= full'看到有关泄漏的详细信息。 – 2013-03-27 13:24:06

+0

很难说,如果你错过了一些东西,而没有看到代码 – Mike 2013-03-27 13:28:01

+0

+1使用valgrind – Dariusz 2013-03-27 13:50:27

回答

4

这非常依赖于你的编译器和openmp库的实现。

我试着用gcc -fopenmp版本4.4.6(GCC)和libgomp 1.0.0来测试你的代码,我也得到了没有被释放的堆块。据我所知libgomp不会杀死它在执行结束时产生的线程,并使内核清理干净。

==85122== HEAP SUMMARY: 
==85122==  in use at exit: 2,072 bytes in 4 blocks 
==85122== total heap usage: 203 allocs, 199 frees, 289,816 bytes allocated 
==85122== 
==85122== 288 bytes in 1 blocks are possibly lost in loss record 3 of 4 
==85122== at 0x4A05A28: calloc (vg_replace_malloc.c:467) 
==85122== by 0x3793A11792: _dl_allocate_tls (in /lib64/ld-2.12.so) 
==85122== by 0x379460701F: [email protected]@GLIBC_2.2.5 (in /lib64/libpthread-2.12.so) 
==85122== by 0x4C15509: gomp_team_start (team.c:422) 
==85122== by 0x400BAA: sort2 (in /usr/users/ga002/lamzins/malloc_openmp) 
==85122== by 0x400B28: sort (in /usr/users/ga002/lamzins/malloc_openmp) 
==85122== by 0x400AAA: main (in /usr/users/ga002/lamzins/malloc_openmp) 
==85122== 
==85122== LEAK SUMMARY: 
==85122== definitely lost: 0 bytes in 0 blocks 
==85122== indirectly lost: 0 bytes in 0 blocks 
==85122==  possibly lost: 288 bytes in 1 blocks 
==85122== still reachable: 1,784 bytes in 3 blocks 
==85122==   suppressed: 0 bytes in 0 blocks 
==85122== Reachable blocks (those to which a pointer was found) are not shown. 
==85122== To see them, rerun with: --leak-check=full --show-reachable=yes 
==85122== 
==85122== For counts of detected and suppressed errors, rerun with: -v 
==85122== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 6 from 6) 

当我icc -openmp版本12.0.2我得到了所有分配的内存释放编译代码。

==85218== HEAP SUMMARY: 
==85218==  in use at exit: 0 bytes in 0 blocks 
==85218== total heap usage: 841 allocs, 841 frees, 4,364,204 bytes allocated 
==85218== 
==85218== All heap blocks were freed -- no leaks are possible 

编辑: 还你所描述的是已知的,不认为是内存泄漏问题:http://gcc.1065356.n5.nabble.com/Bug-libgomp-36298-New-gomp-contains-small-memoryleak-td330804.html

+0

感谢您的解释。我现在知道它的编译方式或编译代码的方式会导致内存泄漏。 – Eagle 2013-03-27 14:27:54

+0

找到了这个报告。这是'valgrind'和'libgomp'的问题,并不是错误或内存泄漏。 – 2013-03-27 14:30:14

+0

将来会添加+1。我还不能添加它 – Eagle 2013-03-27 14:30:20