我试图在C中使用OpenMP初始化动态数组,但它似乎比串行方法慢。我正在使用的功能是
int* createArray(int size, int num) {
int i;
int* M = (int*)malloc(size*sizeof(int));
srand(time(NULL));
double start = omp_get_wtime();
#pragma omp parallel for num_threads(num)
for (i = 0; i < size; i++) {
M[i] = rand() % (MAX_NUMBER - MIN_NUMBER + 1) + MIN_NUMBER;
}
double end = omp_get_wtime();
printf("Create Array %f\n",end-start);
return M;
}
我得到一个包含随机数的给定大小的数组,但我使用的线程越少,函数越快。难道我做错了什么?
答案 0 :(得分:1)
通常,运行速度比相应的顺序实现慢的并行应用程序通常来自启动线程的开销或者具有不完全独立的线程的瓶颈(例如通过共享数据)
这里,前者是正确的,因为你正在呼叫rand()
。此函数使用某些必须在线程之间共享的全局变量。克服这种情况的一种方法是为每个线程使用private
种子。此外,当你有多个线程时,你是否注意到你的数组不是真的随机?您可以将srand()
提供的种子作为omp_get_thread_num()
的函数来解决此问题。
答案 1 :(得分:0)
我很确定您的程序遇到了一个名为“虚假共享”缓存的问题。
下面的文章很好地解释了它。 https://software.intel.com/en-us/articles/avoiding-and-identifying-false-sharing-among-threads
这经常会影响表现。 你可以快速进行测试。在下面添加到你的omp pragma 时间表(静态,16)
这应该会有很大改善。然后你可以进一步挖掘虚假分享。