gpt4 book ai didi

c++ - 打破循环循环

转载 作者:太空宇宙 更新时间:2023-11-04 14:09:02 26 4
gpt4 key购买 nike

#include<iostream>
#include<fstream>
#include<time.h>
#include<omp.h>

using namespace std;
static long num_steps = 100;
#define NUM 8
double step;

void main()
{
clock_t time =clock();
ofstream result;
result.open ("Result.txt");
int a[100];
double pi, sum=0.0;
step = 1.0/(double) num_steps;

#pragma omp parallel num_threads(NUM)
{
int i, ID;
double x, psum= 0.0;
int nthreads = omp_get_num_threads();
ID = omp_get_thread_num();
for (i=ID;i<= num_steps; i+=nthreads)
{
x = (i+0.5)*step;
psum += 4.0/(1.0+x*x);
}
#pragma omp critical
sum += psum;
}

pi = step * sum;
for (int j=0;j<100;j++)
result<<a[j]<<endl;

time = clock() - time;

result << "Time Elapsed: " << (((double)time)/CLOCKS_PER_SEC) << endl;

result <<"======================================================================================="<<endl;
result.close();
}

问题是: for (i=ID;i<= num_steps; i+=nthreads)以下 for 循环按以下顺序执行线程:01234567 01234567 01234567 等...分配是将 for 循环更改为使线程均匀分布,而不是以四舍五入的方式分布。首先是零,然后是一个,然后是两个……然后是七我应该如何更改 forloop?

最佳答案

你必须为此使用某种线程同步......
你标记 Visual Studio 所以我假设 Windows 平台 ...

最近这成了我的最爱:

// init
CRITICAL_SECTION hnd;
InitializeCriticalSectionAndSpinCount(&hnd,0x00000400);

// start lock
EnterCriticalSection(&hnd);
// stop lock
LeaveCriticalSection(&hnd);

// exit
DeleteCriticalSection(&hnd);

但是还有很多其他的方法。

  • 你也可以尝试自己做锁或者无锁线程
  • 但请注意,在较新的操作系统(如 Windows 7)中使用不同的进程调度程序
  • 疯狂的倾向
  • 我的意思是,在以前的操作系统上 100% 工作的无锁代码现在断断续续或卡住
  • 所以我更喜欢使用操作系统锁。

如果错误地使用锁,您可能会失去多线程加速带来的任何好处。

如果您只是担心您的解决方案无法同时计算线程
在您的情况下不是并行而是串行,而不是由此引起的:

  1. 处理时间粒度。

    • 任何计划任务都被划分为时间 block 。
    • 如果您的任务太短,那么它会在其他任务开始执行之前完成。
    • 测试尝试更大的负载(计算时间 > 几秒)
    • 大大增加循环次数
    • 添加 Sleep(time ms) 以获得更长的计算时间
    • 如果输出将是混合的,那就是它
    • 如果不是,那么你仍然在粒度边界下
    • 或者你的多线程代码有误
  2. 错误的多线程代码

    • 您支持同时创建/运行您的线程吗?
    • 或者您是否同步到错误的地方? (比如直到上一个任务结束)
    • 还有一些编译器会处理大量的 volatile 变量(给它加锁,有时会做一些很奇怪的事情……我被它绊倒了很多次,但主要是在 MCU 平台和 Eclipse 上)
  3. 单核

    • 在某些情况下,如果您只有 1 个 CPU/核心/计算机用于处理
    • 或者只是将 affinity mask 设置为单个 CPU
    • 在某些算法上,Windows 调度器不会均匀地调度 CPU 时间
    • 甚至不考虑进程/线程的优先级/类
    • Windows 7 上有时会出现类似的情况,甚至对于更多的 CPU ...
    • 尤其是与内核模式代码混合的代码

要使用粒度,您可以使用他的:

// obtain OS time capabilities
TIMECAPS tim;
timeGetDevCaps(&tim,sizeof(tim));

// set new granularity
if (timeBeginPeriod(time ms)!=TIMERR_NOERROR) log("time granularity out of range");

// return to previous hranularity
timeEndPeriod(time ms ... must be the same as beginperiod);out of range");

附言。这里有关于此的非常好的资料:

http://bitflipgames.com/2011/05/09/multithreaded-programming-part-1-the-critical-section-lock/ http://bitflipgames.com/2011/05/17/multithreaded-programming-part-2-multiple-readersingle-writer-lock/ http://bitflipgames.com/2011/05/20/multithreaded-programming-part-2-5-mrsw-lock-code/ http://bitflipgames.com/2011/05/25/multithreaded-programming-part-3-going-lockless/

关于c++ - 打破循环循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15645403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com