openmp是否会分配内存并释放所有内容

openmp是否分配内存并释放所有内存? 因为我跑了valgrind,并且释放了我所有的名单..我在malloc的所有东西,我都自由了。

==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  #include  #include  /*check definition of _OPENMP*/ #ifdef _OPENMP #include  #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  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 */ 

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

此代码:来自算法第四版,Robert Sedgewick | 凯文韦恩。 这是一个java实现,我改为ac实现并使用openmp瘫痪

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

这在很大程度上取决于您的编译器和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: pthread_create@@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