Memory leaks dgemm中的内存泄漏_

Memory leaks dgemm中的内存泄漏_,memory-leaks,valgrind,lapack,blas,Memory Leaks,Valgrind,Lapack,Blas,我目前正在开发一个应用程序,它涉及到对blas例程的大量调用。定期检查我发现的内存泄漏,我在一次调用中丢失了字节。该呼叫如下所示: // 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, &

我目前正在开发一个应用程序,它涉及到对blas例程的大量调用。定期检查我发现的内存泄漏,我在一次调用中丢失了字节。该呼叫如下所示:

// 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)

我检查了矩阵的尺寸。正如预期的那样。我不明白一个dgemm_uuu电话怎么会造成这样的泄漏。我能理解非法的书写或阅读。但是我不明白dgemm_uuu怎么会导致泄漏。

查看堆栈跟踪,泄漏(如果它真的是泄漏,valgrind可能会产生误报)不在BLAS调用本身,而是在用户空间库中,加速框架在这些BLAS调用中用于多线程支持。对此你真的无能为力。如果泄漏影响了应用程序的性能或稳定性,请将其作为错误报告给苹果。

谢谢,我会记在心里,暂时忽略它:-D