OpenMP并行化 我用科学的目的写一个C++程序。strong>该程序运行良好,结果良好,因此我决定使用OpenMP改进其性能。我要优化的循环如下: //== #pragma omp parallel for private(i,j) for (k=0; k < number; k++) { for (i=0; i < L; i++) { for (j=0; j < L; j++) { red[i][j] = UNDEFINED; } } Point inicial = {L/2, L/2, OCCUPIED}; red[L/2][L/2] = OCCUPIED; addToList(inicial, red, list, L,f); oc.push_back(inicial); while (list.size() > 0 && L > 0) { punto = selectPoint(red, list, generator, prob, p); if (punto.state == OCCUPIED) { addToList(punto, red, list, L,f); oc.push_back(punto); } else { out.push_back(punto); } } L = auxL; oc.clear(); out.clear(); list.clear(); } f = f*1.0/(number*1.0); if (f > 0.5) { inta = inta; intb = p; p = (inta + intb) / 2.0; } else if (f < 0.5) { intb = intb; inta = p; p = (inta + intb) / 2.0; } cout << p << endl; } /=#专用pragma omp并行(i,j) 对于(k=0;k0.5) { inta=inta; intb=p; p=(inta+intb)/2.0; } 否则,如果(f

OpenMP并行化 我用科学的目的写一个C++程序。strong>该程序运行良好,结果良好,因此我决定使用OpenMP改进其性能。我要优化的循环如下: //== #pragma omp parallel for private(i,j) for (k=0; k < number; k++) { for (i=0; i < L; i++) { for (j=0; j < L; j++) { red[i][j] = UNDEFINED; } } Point inicial = {L/2, L/2, OCCUPIED}; red[L/2][L/2] = OCCUPIED; addToList(inicial, red, list, L,f); oc.push_back(inicial); while (list.size() > 0 && L > 0) { punto = selectPoint(red, list, generator, prob, p); if (punto.state == OCCUPIED) { addToList(punto, red, list, L,f); oc.push_back(punto); } else { out.push_back(punto); } } L = auxL; oc.clear(); out.clear(); list.clear(); } f = f*1.0/(number*1.0); if (f > 0.5) { inta = inta; intb = p; p = (inta + intb) / 2.0; } else if (f < 0.5) { intb = intb; inta = p; p = (inta + intb) / 2.0; } cout << p << endl; } /=#专用pragma omp并行(i,j) 对于(k=0;k0.5) { inta=inta; intb=p; p=(inta+intb)/2.0; } 否则,如果(f,c++,openmp,scientific-computing,C++,Openmp,Scientific Computing,您可能需要浏览OpenMP教程。当您查看OpenMP代码时,您需要想象并行会发生什么。接受 oc.push_back(inicial); 两个线程可以同时尝试这样做吗?对std::vector支持并行性吗?没有 上面的代码充满了这些东西 如果要在OpenMP ode中使用数据结构,则需要。根据我个人的经验,当这种情况发生时,重构算法比实际使用它们要好得多。虽然OpenMP+锁是可能的,但这通常表明该想法存在问题(=可能是主观观点)。当前的答案指出了代码中的并发性,但请注意,并非所有数据结构

您可能需要浏览OpenMP教程。当您查看OpenMP代码时,您需要想象并行会发生什么。接受

oc.push_back(inicial); 
两个线程可以同时尝试这样做吗?对
std::vector
支持并行性吗?没有

上面的代码充满了这些东西



如果要在OpenMP ode中使用数据结构,则需要。根据我个人的经验,当这种情况发生时,重构算法比实际使用它们要好得多。虽然OpenMP+锁是可能的,但这通常表明该想法存在问题(=可能是主观观点)。

当前的答案指出了代码中的并发性,但请注意,并非所有数据结构都必须使用锁来实现线程安全。还有
无锁
数据结构。对于这种特殊情况,我们可以使用Harris无锁链表:

虽然我知道指出OP的并发性问题在这一点上有很大的帮助,但我想确保我们不会因为说锁对于实现线程安全是绝对必要的而传达错误的信息

指令#pragma omp parallel定义了一段可由不同线程同时执行的代码。在您的情况下,由于您没有指定任何进一步的指令,您的并行区域将由每个线程执行一次。为了实现并行行为,您可以尝试将循环分解为更小的任务(taskloop指令将完成此任务)。这些任务将保留在任务池中,直到线程开始执行它们。这样,循环将被分割并由线程执行,而不是让每个线程执行整个循环


这是taskloop指令的官方openMP文档。

因此,如果我使用
std::vector
,那么就无法使用openMP?@V\u程序员@Zboson那太有用了!我想我可以用我的代码,我会尝试一下。