What is the equivalent of OpenMP Tasks in Pthreads in this recursion example?
up vote
0
down vote
favorite
I am studying parallel programming and I use the following OpenMP directive to parallelize a recursive function:
voir recursiveFunction()
{
//sequential code
#pragma omp task
{
recursiveFunction(); //First instance
} //Independent from each other,
//they allow an embarrassingly parallel strategy
recursiveFunction(); //Second instance
}
It works good enough, but I have a hard time trying to make an equivalent parallelization using only pthreads.
I was thinking something like this:
voir recursiveFunction()
{
//sequential code
Pthread_t thread;
//First instance
pthread_create(thread, NULL, recursiveFunction, recFuncStructParameter);
//Second instance
recursiveFunction();
}
And... I am kind of lost here... I can not grasp how to control the number of threads, if for example I want only 16 threads to by created and if all of them are "busy" then continue sequentially until one of them is freed, then do parallel again.
Could someone point me in the right direction? I have seen may examples which seem really complicated but I have a feeling that in this particular example, which allows an embarrassingly parallel strategy, there is a simle approach which I am unable to point out...
c pthreads openmp
add a comment |
up vote
0
down vote
favorite
I am studying parallel programming and I use the following OpenMP directive to parallelize a recursive function:
voir recursiveFunction()
{
//sequential code
#pragma omp task
{
recursiveFunction(); //First instance
} //Independent from each other,
//they allow an embarrassingly parallel strategy
recursiveFunction(); //Second instance
}
It works good enough, but I have a hard time trying to make an equivalent parallelization using only pthreads.
I was thinking something like this:
voir recursiveFunction()
{
//sequential code
Pthread_t thread;
//First instance
pthread_create(thread, NULL, recursiveFunction, recFuncStructParameter);
//Second instance
recursiveFunction();
}
And... I am kind of lost here... I can not grasp how to control the number of threads, if for example I want only 16 threads to by created and if all of them are "busy" then continue sequentially until one of them is freed, then do parallel again.
Could someone point me in the right direction? I have seen may examples which seem really complicated but I have a feeling that in this particular example, which allows an embarrassingly parallel strategy, there is a simle approach which I am unable to point out...
c pthreads openmp
because every thread has own call stack so there is no synchronization required between stack. So is your problem is controlling more than one thread?
– Susheel Dwivedi
Nov 19 at 9:44
The naive solution of spawning off one thread for each recursion does not scale at all - so the solution is is in fact very complicated. Perhaps too complicated for an answer here.
– Zulan
Nov 19 at 11:24
You can see one solution if you look at Threading Building Blocks (threadingbuildingblocks.org ) which is a tasking system built on top of native threads. (pthreads on Linux). But it really makes the point that @Zulan did: "The solution is very complicated". (Though, of course, if this is what you need you are free to use it!)
– Jim Cownie
Nov 26 at 9:22
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I am studying parallel programming and I use the following OpenMP directive to parallelize a recursive function:
voir recursiveFunction()
{
//sequential code
#pragma omp task
{
recursiveFunction(); //First instance
} //Independent from each other,
//they allow an embarrassingly parallel strategy
recursiveFunction(); //Second instance
}
It works good enough, but I have a hard time trying to make an equivalent parallelization using only pthreads.
I was thinking something like this:
voir recursiveFunction()
{
//sequential code
Pthread_t thread;
//First instance
pthread_create(thread, NULL, recursiveFunction, recFuncStructParameter);
//Second instance
recursiveFunction();
}
And... I am kind of lost here... I can not grasp how to control the number of threads, if for example I want only 16 threads to by created and if all of them are "busy" then continue sequentially until one of them is freed, then do parallel again.
Could someone point me in the right direction? I have seen may examples which seem really complicated but I have a feeling that in this particular example, which allows an embarrassingly parallel strategy, there is a simle approach which I am unable to point out...
c pthreads openmp
I am studying parallel programming and I use the following OpenMP directive to parallelize a recursive function:
voir recursiveFunction()
{
//sequential code
#pragma omp task
{
recursiveFunction(); //First instance
} //Independent from each other,
//they allow an embarrassingly parallel strategy
recursiveFunction(); //Second instance
}
It works good enough, but I have a hard time trying to make an equivalent parallelization using only pthreads.
I was thinking something like this:
voir recursiveFunction()
{
//sequential code
Pthread_t thread;
//First instance
pthread_create(thread, NULL, recursiveFunction, recFuncStructParameter);
//Second instance
recursiveFunction();
}
And... I am kind of lost here... I can not grasp how to control the number of threads, if for example I want only 16 threads to by created and if all of them are "busy" then continue sequentially until one of them is freed, then do parallel again.
Could someone point me in the right direction? I have seen may examples which seem really complicated but I have a feeling that in this particular example, which allows an embarrassingly parallel strategy, there is a simle approach which I am unable to point out...
c pthreads openmp
c pthreads openmp
asked Nov 19 at 7:34
Vector Sigma
1084
1084
because every thread has own call stack so there is no synchronization required between stack. So is your problem is controlling more than one thread?
– Susheel Dwivedi
Nov 19 at 9:44
The naive solution of spawning off one thread for each recursion does not scale at all - so the solution is is in fact very complicated. Perhaps too complicated for an answer here.
– Zulan
Nov 19 at 11:24
You can see one solution if you look at Threading Building Blocks (threadingbuildingblocks.org ) which is a tasking system built on top of native threads. (pthreads on Linux). But it really makes the point that @Zulan did: "The solution is very complicated". (Though, of course, if this is what you need you are free to use it!)
– Jim Cownie
Nov 26 at 9:22
add a comment |
because every thread has own call stack so there is no synchronization required between stack. So is your problem is controlling more than one thread?
– Susheel Dwivedi
Nov 19 at 9:44
The naive solution of spawning off one thread for each recursion does not scale at all - so the solution is is in fact very complicated. Perhaps too complicated for an answer here.
– Zulan
Nov 19 at 11:24
You can see one solution if you look at Threading Building Blocks (threadingbuildingblocks.org ) which is a tasking system built on top of native threads. (pthreads on Linux). But it really makes the point that @Zulan did: "The solution is very complicated". (Though, of course, if this is what you need you are free to use it!)
– Jim Cownie
Nov 26 at 9:22
because every thread has own call stack so there is no synchronization required between stack. So is your problem is controlling more than one thread?
– Susheel Dwivedi
Nov 19 at 9:44
because every thread has own call stack so there is no synchronization required between stack. So is your problem is controlling more than one thread?
– Susheel Dwivedi
Nov 19 at 9:44
The naive solution of spawning off one thread for each recursion does not scale at all - so the solution is is in fact very complicated. Perhaps too complicated for an answer here.
– Zulan
Nov 19 at 11:24
The naive solution of spawning off one thread for each recursion does not scale at all - so the solution is is in fact very complicated. Perhaps too complicated for an answer here.
– Zulan
Nov 19 at 11:24
You can see one solution if you look at Threading Building Blocks (threadingbuildingblocks.org ) which is a tasking system built on top of native threads. (pthreads on Linux). But it really makes the point that @Zulan did: "The solution is very complicated". (Though, of course, if this is what you need you are free to use it!)
– Jim Cownie
Nov 26 at 9:22
You can see one solution if you look at Threading Building Blocks (threadingbuildingblocks.org ) which is a tasking system built on top of native threads. (pthreads on Linux). But it really makes the point that @Zulan did: "The solution is very complicated". (Though, of course, if this is what you need you are free to use it!)
– Jim Cownie
Nov 26 at 9:22
add a comment |
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53370139%2fwhat-is-the-equivalent-of-openmp-tasks-in-pthreads-in-this-recursion-example%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
because every thread has own call stack so there is no synchronization required between stack. So is your problem is controlling more than one thread?
– Susheel Dwivedi
Nov 19 at 9:44
The naive solution of spawning off one thread for each recursion does not scale at all - so the solution is is in fact very complicated. Perhaps too complicated for an answer here.
– Zulan
Nov 19 at 11:24
You can see one solution if you look at Threading Building Blocks (threadingbuildingblocks.org ) which is a tasking system built on top of native threads. (pthreads on Linux). But it really makes the point that @Zulan did: "The solution is very complicated". (Though, of course, if this is what you need you are free to use it!)
– Jim Cownie
Nov 26 at 9:22