我一直在测试OpenmP和GMP的瓶颈问题。我发现了一些有趣的数据。
我的代码如下,
#include<stdio.h>
#include<stdlib.h>
#include<gmp.h>
#include<omp.h>
void test_fun()
{
mpz_t x;
mpz_init(x);
mpz_set_ui(x,2);
mpz_clear(x);
mpz_init(x);
mpz_set_ui(x,2);
mpz_clear(x);
}
int main()
{
long i;
double time = omp_get_wtime();
#pragma omp parallel for
for(i=0;i<100000000;i++)
{
test_fun();
}
time = omp_get_wtime() - time;
printf("Time Taken %lf\n",time);
return 1;
}
这在我的四核i5处理器中产生了4个线程需要1.755720秒。现在,如果我使用单核(无openmp)将循环迭代25000000次(1/4次),则需要1.555573秒。因此,对于多个线程使用GMP肯定会有开销。谁能指出主要原因。
每个mpz_init内部都会进行malloc调用可能是有原因的。由于malloc在所有线程之间都是原子的,因此可能会创建这样的时间间隔。还是还有其他原因?