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...










share|improve this question






















  • 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















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...










share|improve this question






















  • 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













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...










share|improve this question













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






share|improve this question













share|improve this question











share|improve this question




share|improve this question










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


















  • 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

















active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















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






























active

oldest

votes













active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































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.




draft saved


draft discarded














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





















































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







Popular posts from this blog

If I really need a card on my start hand, how many mulligans make sense? [duplicate]

Alcedinidae

Can an atomic nucleus contain both particles and antiparticles? [duplicate]