我想以公平的方式将可变大小的数组数据拆分到固定线程数的中。
案例1:在4个线程之间公平地划分Data7 ()
线程ID 0: Data,Data1线程ID 1: Data2,Data3线程ID 2: Data4,Data5线程ID 3: Data6
现在,我的代码不公平地划分了数组。
案例2:将Data7划分为4个线程()
线程ID 0:数据线程ID 1: Data1线程ID 2: Data2线程ID 3: Data3、Data4、Data5、Data6
下面是实现Case 2的代码。
#include <iostream>
using namespace std;
const unsigned int NUMELEM = 7;
const unsigned int THREADCNT = 4;
unsigned int elemPerThread = NUMELEM/THREADCNT;
unsigned int remElements = NUMELEM % THREADCNT;
int Data[NUMELEM];
void DoStuff( unsigned int const& thid )
{
unsigned int startIndex = thid*elemPerThread;
unsigned int endIndex = startIndex + elemPerThread;
cout<<"Thread ID "<<thid<<": ";
for( unsigned int index = startIndex; index != endIndex; index++ )
{
cout<<"Data["<<index<<"], ";
}
if( (thid+1) == THREADCNT )
{
for( unsigned i = 0; i!= remElements; i++)
{
cout<<"Data["<<endIndex + i<<"], ";
}
}
cout<<endl;
}
int main()
{
for( unsigned int thid = 0; thid != THREADCNT; thid++)
{
// TBU: Make multithreaded
DoStuff( thid );
}
return 0;
}
我想要案例1的解决方案
发布于 2014-02-07 19:40:12
抱歉,我的代码又快又脏,但我认为它是起作用的。
void DoStuff( unsigned int const& thid )
{
cout<<"ThID:"<<thid<<endl;
const unsigned numTasks = NUMELEM/THREADCNT, numTougherThreads = NUMELEM%THREADCNT;
for( unsigned int index0 = (thid < numTougherThreads ? thid * (numTasks+1) : NUMELEM - (THREADCNT - thid) * numTasks), index = index0; index < index0 + numTasks + (thid < numTougherThreads) ; ++index)
{
cout<<"Data["<<index<<"], ";
}
cout<<endl;
}
http://ideone.com/3CeMm8 (@dasblinkenlight‘s的叉子)
我的代码背后的想法是:
thread0
负责第一个(NUMELEM/THREADCNT)+1
任务;thread1
负责下一个(NUMELEM/THREADCNT)+1
任务.(NUMELEM/THREADCNT)
任务;第二个最后一个线程负责第二个 (NUMELEM/THREADCNT)
任务.(NUMELEM%THREADCNT)
线程(“更硬的”线程)有(NUMELEM/THREADCNT)+1
任务。https://stackoverflow.com/questions/21635702
复制相似问题