Splitting an array between a fixed number of threads

I want to split a variable array Data [] among a fixed number of threads in a fair way

Case 1: Splitting data [7] among 4 streams is enough

Thread ID 0: Data[0], Data[1]
Thread ID 1: Data[2], Data[3]
Thread ID 2: Data[4], Data[5]
Thread ID 3: Data[6]

Currently, my code divides the array unfairly

Case 2: Share Data [7] Among 4 Streams

Thread ID 0: Data[0]
Thread ID 1: Data[1]
Thread ID 2: Data[2]
Thread ID 3: Data[3], Data[4], Data[5], Data[6]

Here is the code that implements 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;
}

I want a solution to Case 1

+3
source share
1 answer

Sorry for my quick and dirty code, but I think it is doing its job.

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 (plug from @dasblinkenlight)

The idea of ​​my code is:

  • thread0 (NUMELEM/THREADCNT)+1; thread1 (NUMELEM/THREADCNT)+1...

  • last last (NUMELEM/THREADCNT); (NUMELEM/THREADCNT) ...

  • (NUMELEM%THREADCNT) ( " " ) (NUMELEM/THREADCNT)+1 .

+2

All Articles