2013-03-27 3 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 */ 

:

내 코드입니다 ===================================

다음 코드 : 알고리즘에서 왔습니다. FOURTH EDITION, Robert Sedgewick | 케빈 웨인. 내가 교류 구현 변경 OpenMP를 마비 자바 구현을했다

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

+2

다시 실행 Valgrind의 --leak 검사 '로 = full'이 볼 수있는 세부 사항 . –

+0

코드를 보지 않고 무언가를 놓친다면 알려주기가 어렵습니다. – Mike

+0

+1로 valgrind를 사용했습니다. – Dariusz

답변

4

이것은 컴파일러와 openmp 라이브러리 구현에 따라 크게 달라집니다.

코드를 gcc -fopenmp 버전 4.4.6 (GCC) 및 libgomp 1.0.0으로 시도했으며 할당 해제되지 않은 힙 블록도 얻었습니다. 내가 할 수있는 한 libgomp은 실행이 끝날 때 생성 된 스레드를 죽이지 않으며 커널이이를 정리하도록 만듭니다.

내가 모든 할당 된 메모리가 해제되었다 icc -openmp 버전 12.0.2 사용하여 코드를 컴파일
==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) 

.

==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

+0

이 보고서를 찾았습니다. 그것은 valgrind와 libgomp의 문제이며 버그 나 메모리 누수가 아닙니다. –

+0

향후 +1이 추가됩니다. 아직 추가 할 수 없습니다 – Eagle

관련 문제