2012-01-05 5 views
3

현재 blas 루틴에 대한 많은 호출이 포함 된 응용 프로그램을 작성하고 있습니다. 메모리 누출에 대해 정기적으로 검사합니다. 즉, dgemm 호출에서 바이트가 누락되었습니다. 전화 번호는 다음과 같습니다.dgemm_ 메모리 누수

// I want to multiply 2 nxn matrices and put the result into C - an nxn matrix 
double zero = 0.0; 
double one = 1.0; 
double n; // matrix dimension 
char N = 'N'; 
dgemm_(&N, &N, &n, &n, &n, &one, A, &n, B, &n, &zero, C, &n); 

A, B 및 C는 크기가 n * n 인 이중 필드입니다. Valgrind의 출력은 :

==78182== 18 bytes in 1 blocks are definitely lost in loss record 2 of 30 
==78182== at 0xB936: malloc_zone_malloc (vg_replace_malloc.c:267) 
==78182== by 0xF0B8C6: malloc_set_zone_name (in /usr/lib/system/libsystem_c.dylib) 
==78182== by 0xF0BDF2: _malloc_initialize (in /usr/lib/system/libsystem_c.dylib) 
==78182== by 0xF0C201: malloc_create_zone (in /usr/lib/system/libsystem_c.dylib) 
==78182== by 0xE0533B: _dispatch_ccache_init (in /usr/lib/system/libdispatch.dylib) 
==78182== by 0xE08223: dispatch_once_f (in /usr/lib/system/libdispatch.dylib) 
==78182== by 0xE05305: _dispatch_continuation_alloc_from_heap (in /usr/lib/system/libdispatch.dylib) 
==78182== by 0xE072C8: dispatch_group_async_f (in /usr/lib/system/libdispatch.dylib) 
==78182== by 0x96465F: dgemmGCD (in /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib) 
==78182== by 0x4F1A47: cblas_dgemm (in /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib) 
==78182== by 0x4B8914: DGEMM (in /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib) 
==78182== by 0x100035587: nrg::NRGFD::buildDM() (NRGFD.cpp:1785) 
==78182== 
==78182== 22 bytes in 1 blocks are definitely lost in loss record 3 of 30 
==78182== at 0xB936: malloc_zone_malloc (vg_replace_malloc.c:267) 
==78182== by 0xF0B8C6: malloc_set_zone_name (in /usr/lib/system/libsystem_c.dylib) 
==78182== by 0xE08223: dispatch_once_f (in /usr/lib/system/libdispatch.dylib) 
==78182== by 0xE05305: _dispatch_continuation_alloc_from_heap (in /usr/lib/system/libdispatch.dylib) 
==78182== by 0xE072C8: dispatch_group_async_f (in /usr/lib/system/libdispatch.dylib) 
==78182== by 0x96465F: dgemmGCD (in /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib) 
==78182== by 0x4F1A47: cblas_dgemm (in /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib) 
==78182== by 0x4B8914: DGEMM (in /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib) 
==78182== by 0x100035587: nrg::NRGFD::buildDM() (NRGFD.cpp:1785) 
==78182== by 0x10003C5E6: nrg::NRGFD::solve() (NRGFD.cpp:147) 
==78182== by 0x10001AC83: main (main.cpp:63) 

내가 matrizes의 크기를 조사했다. 그들은 예상대로입니다. 나는 dgemm_ 호출이 그런 누수를 만드는 방법을 얻지 못한다. 나는 불법적 인 글쓰기 또는 읽기를 이해할 수있었습니다. 하지만 dgemm_이 누출을 일으킬 수있는 방법을 이해하지 못합니다.

답변

3

스택 추적을 보면 누출 (실제로 누수 인 경우 valgrind가 잘못된 긍정을 생성 할 수 있음)은 BLAS 호출 자체에 없으며 Accelerate 프레임 워크가 다중으로 사용하는 OS X Grand Central Dispatch 사용자 공간 라이브러리에 있습니다 BLAS 호출에서 스레드 지원을 지원합니다. 당신이 그것에 대해 할 수있는 일이 정말로 없습니다. 누수가 응용 프로그램의 성능이나 안정성에 영향을주는 경우 Apple에 버그로보고하십시오.

+0

감사합니다. 나는 이것을 내 머리 뒤에서 지키고 무시합니다 .-D –