- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
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
如果不是为什么在一个 block 中仍然存在内存泄漏?
这是我的代码:
#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 */
============================================= ===================================
此代码:来自算法第四版,Robert Sedgewick |凯文·韦恩。这是一个java实现,我将其更改为c实现并用openmp瘫痪
============================================= ===================================
最佳答案
这在很大程度上取决于您的编译器和 openmp 库实现。
我用 gcc -fopenmp
版本 4.4.6 (GCC) 和 libgomp
1.0.0 尝试了你的代码,我也得到了尚未释放的堆 block 。据我所知,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
关于c - openmp是否分配内存并释放所有内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15659832/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!