Il modo in cui ho capito, esistono molte diverse implementazioni malloc:Come sapere quale malloc viene utilizzato?
- dlmalloc - Uso generale allocatore
- ptmalloc2 - glibc
- jemalloc - FreeBSD e Firefox
- tcmalloc - Google
- libumem - Solaris
C'è un modo per determinare quale mal loc è effettivamente utilizzato sul mio sistema (linux)?
Ho letto che "a causa del supporto per il threading di ptmalloc2, è diventato l'allocatore di memoria predefinito per linux." C'è qualche modo per me per controllare questo da solo?
sto chiedendo perché non mi sembra di avere qualsiasi velocità da paralellizing mio ciclo malloc nel seguente codice:
for (int i = 1; i <= 16; i += 1) {
parallelMalloc(i);
}
void parallelMalloc(int parallelism, int mallocCnt = 10000000) {
omp_set_num_threads(parallelism);
std::vector<char*> ptrStore(mallocCnt);
boost::posix_time::ptime t1 = boost::posix_time::microsec_clock::local_time();
#pragma omp parallel for
for (int i = 0; i < mallocCnt; i++) {
ptrStore[i] = ((char*)malloc(100 * sizeof(char)));
}
boost::posix_time::ptime t2 = boost::posix_time::microsec_clock::local_time();
#pragma omp parallel for
for (int i = 0; i < mallocCnt; i++) {
free(ptrStore[i]);
}
boost::posix_time::ptime t3 = boost::posix_time::microsec_clock::local_time();
boost::posix_time::time_duration malloc_time = t2 - t1;
boost::posix_time::time_duration free_time = t3 - t2;
std::cout << " parallelism = " << parallelism << "\t itr = " << mallocCnt << "\t malloc_time = " <<
malloc_time.total_milliseconds() << "\t free_time = " << free_time.total_milliseconds() << std::endl;
}
che mi dà una potenza di
parallelism = 1 itr = 10000000 malloc_time = 1225 free_time = 1517
parallelism = 2 itr = 10000000 malloc_time = 1614 free_time = 1112
parallelism = 3 itr = 10000000 malloc_time = 1619 free_time = 687
parallelism = 4 itr = 10000000 malloc_time = 2325 free_time = 620
parallelism = 5 itr = 10000000 malloc_time = 2233 free_time = 550
parallelism = 6 itr = 10000000 malloc_time = 2207 free_time = 489
parallelism = 7 itr = 10000000 malloc_time = 2778 free_time = 398
parallelism = 8 itr = 10000000 malloc_time = 1813 free_time = 389
parallelism = 9 itr = 10000000 malloc_time = 1997 free_time = 350
parallelism = 10 itr = 10000000 malloc_time = 1922 free_time = 291
parallelism = 11 itr = 10000000 malloc_time = 2480 free_time = 257
parallelism = 12 itr = 10000000 malloc_time = 1614 free_time = 256
parallelism = 13 itr = 10000000 malloc_time = 1387 free_time = 289
parallelism = 14 itr = 10000000 malloc_time = 1481 free_time = 248
parallelism = 15 itr = 10000000 malloc_time = 1252 free_time = 297
parallelism = 16 itr = 10000000 malloc_time = 1063 free_time = 281
Dipende dalla libreria (librerie) con cui si collega. L'impostazione predefinita sarà probabilmente quella di glibc: dovresti lavorare per assicurarti di utilizzare un'altra versione. Inoltre, C++ usa 'new' e' delete' (e varianti); non sono necessariamente legati a 'malloc()' e 'free()'. –
Problema XY? Perché ti interessi? – SergeyA
@SergeyA Mi interessa perché vorrei essere sicuro di utilizzare un malloc che supporta il multithreading w.r.t. prestazione. – user695652