2012-01-05 184 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 – 2012-01-07 01:51:49