据我所知,这个程序在用两个线程运行时应该会得到2个或更多的加速。相反,我得到的几乎和连续剧一样。
静态void proc_paralelo(int n,char*vprimos,int nthr){
omp_set_num_threads(nthr);int i, j, prim, posiciones;int raiz_n = sqrt(n);for (i=1;i < raiz_n; i++){ if (vprimos[i]==0) { prim=i+1; posiciones=ceil((float)(n-(i+prim))/(float)prim);#pragma omp parallel for private(j) schedule (static, posiciones/omp_get_num_threads()) for (j=0; j<posiciones; j++){ vprimos[i+prim+(j*prim)]=1;} } }}
我使用的线程数是2(我的处理器的内核),而n的大小是20000000。
我得到的时间是:
序列号:650000000ns
并行:63000000ns

最佳答案

通过运行两个线程,您将永远不会(编辑:很少,请参阅注释)看到超过2倍的加速。事实上,因为没有一个作业是完全可并行的,所以您甚至可能看不到它。还可以考虑,启动一个新线程需要相当多的资源——除非您的工作负载足以使CPU饱和超过启动一个新线程所需的时间(对于CPU受限的工作负载),否则您可能看不到任何收益,也可能会看到性能损失。您还将受到共享资源争用的限制,因为您的线程正在共享一些硬件或软件资源-请参阅注释以获取一些示例。

10-04 12:19