什么是tbb::scalable_allocator英特尔线程构建模块实际上是引擎盖下呢?
它肯定是有效的.我刚用它来采取25%的折扣的应用程式的执行时间(并看到在CPU利用率从〜200%4核系统上增加至350%),通过改变单个std::vector<T>给std::vector<T,tbb::scalable_allocator<T> >.另一方面,在另一个应用程序中,我看到它将已经很大的内存消耗加倍并将内容发送到交换城市.
英特尔自己的文档并没有给出太多帮助(例如本常见问题解答末尾的简短部分 ).在我自己去挖掘代码之前,谁能告诉我它使用了什么技巧?
更新:刚刚第一次使用TBB 3.0,并且从Scalable_allocator看到了我最好的加速.改变单一vector<int>的vector<int,scalable_allocator<int> >(从测试的Debian莱尼,核2,与TBB 3.0)的从85S东西35S减少的运行时间.
当我查看gdb中的backtrace时,我的应用程序有时会主要在malloc()和malloc_consolidate()中进行段错误.
我确认机器有足够的可用内存,甚至没有开始交换.我检查了ulimits的数据分段和最大内存大小,两者都设置为'无限'.我还在valgrind下运行了应用程序,但没有发现任何内存错误.
现在我没有想到还有什么可能导致这些段错误.有任何想法吗 ?
更新: 由于我没有找到valgrind(或ptrcheck)的任何内容,可能是因为另一个应用程序正在破坏libc的内存结构,还是每个进程都有一个单独的结构?
我总是用Java编程,这可能就是为什么我对此很困惑:
在Java中我声明了一个指针:
int[] array
Run Code Online (Sandbox Code Playgroud)
并初始化它或为其分配一些内存:
int[] array = {0,1,0}
int[] array = new int[3]
Run Code Online (Sandbox Code Playgroud)
现在,在C中,这一切都让人感到困惑.起初我以为它就像宣布它一样容易:
int array[]
Run Code Online (Sandbox Code Playgroud)
并初始化它或为其分配一些内存:
int array[] = {0,1,0}
int array[] = malloc(3*sizeof(int))
int array[] = calloc(3,sizeof(int))
Run Code Online (Sandbox Code Playgroud)
除非我错了,以上所有内容都等同于Java-C,对吗?
然后,今天我遇到了一个代码,其中我发现了以下内容:
pthread_t tid[MAX_OPS];
Run Code Online (Sandbox Code Playgroud)
以及下面的一些行,没有任何初始化......
pthread_create(&tid[0],NULL,mou_usuari,(void *) 0);
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是(至少对我而言)代码有效!至少在Java中,会返回一个很好的"NullPointerException"!
所以,按顺序:
我是否正确使用所有Java-C"翻译"?
为什么该代码有效?
使用malloc(n*sizeof(int))和之间有什么区别calloc(n,sizeof(int))吗?
提前致谢
我正在尝试实现malloc和freeC,我不知道如何重用内存.我目前struct看起来像这样:
typedef struct _mem_dictionary {
void *addr;
size_t size;
int freed;
} mem_dictionary;
Run Code Online (Sandbox Code Playgroud)
我malloc看起来像这样:
void *malloc(size_t size) {
void *return_ptr = sbrk(size);
if (dictionary == NULL)
dictionary = sbrk(1024 * sizeof(mem_dictionary));
dictionary[dictionary_ct].addr = return_ptr;
dictionary[dictionary_ct].size = size;
dictionary[dictionary_ct].freed = 1;
dictionary_ct++;
return return_ptr;
}
Run Code Online (Sandbox Code Playgroud)
当我释放内存时,我只会将地址标记为0(表示它是免费的).在我看来malloc,我会使用for循环来查找数组中的任何值0,然后将内存分配给该地址.我有点困惑如何实现这一点.
int *p=(int * )malloc(sizeof(int));
delete p;
Run Code Online (Sandbox Code Playgroud)
当我们使用malloc分配内存时,我们应该使用free释放它,当我们在C++中使用new分配时,我们应该使用delete释放它.
但是如果我们使用malloc分配内存然后使用delete,那么应该会有一些错误.但是在上面的代码中,C++中没有错误或警告.
此外,如果我们使用new进行反向和分配并使用free进行释放,那么也没有错误或警告.
为什么会这样?
我曾经在boost :: pool中玩了几次,在我看来我正在用很多对象"churn"认真地敲打堆.通常我已经使用过boost::object_pool,或者boost::pool_alloc作为STL模板参数.然而,结果总是表明性能几乎没有变化,或者显着恶化.
我很想知道它有任何成功的故事.
我应该在分析输出中寻找什么样的东西,这可能表明boost :: pool可能会有所帮助?
实际上很难改进好的旧malloc吗?
我在C中有一个malloc,它是26901 ^ 2*sizeof(double)
这让我想到这里最大的价值是什么?
另外,定义宏来访问这个2D数组有什么问题吗?
#define DN(i,j) ((int)i * ny + (int)j)
Run Code Online (Sandbox Code Playgroud)
因为这对我来说似乎不起作用 - 或者我至少不确定它是不是.我无法弄清楚如何在宏上进行全视图潜水,告诉我A [DN(indx,jndx)]实际上是在看什么.
因为我读过realloc将作为malloc,如果指向的大小是0,我使用它没有malloc(),前提是指针是静态的,全局的,或者如果是自动的话显式设置为NULL.
但是,我注意到很多程序员试图设置它或将其设置为malloc(1).需要它吗?
让我们考虑一下这段很短的代码片段:
#include <stdlib.h>
int main()
{
char* a = malloc(20000);
char* b = realloc(a, 5);
free(b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在阅读了realloc的手册页后,我不完全确定第二行会导致释放19995个额外字节.引用手册页:The realloc() function changes the size of the memory block pointed to by ptr to size bytes.但是根据该定义,我可以确定其余的将被释放吗?
我的意思是,指向的块b肯定包含5个空闲字节,所以对于懒惰的顺从分配器是否足以让realloc行不做任何事情?
注意:我使用的分配器似乎释放了19 995个额外字节,如valgrind在注释掉free(b)行时所示:
==4457== HEAP SUMMARY:
==4457== in use at exit: 5 bytes in 1 blocks
==4457== total heap usage: 2 allocs, 1 frees, 20,005 bytes allocated
Run Code Online (Sandbox Code Playgroud)