firstprivate clause in OpenMP does not work












0















I have a loop which operate with class objects and functions. Also it calculate several sum values. I've try to parallel it with OpenMP:



    Network  net = *m_pNetwork;
TrainingSet tran = trainingSet;
omp_set_num_threads(4);

#pragma omp parallel for reduction(+:MSE, incorrectEntries) firstprivate(tran, net) lastprivate(net) private(outputIdx)
for (int i = 0; i < tran.size(); i++)
{
net->Evaluate(tran[i].m_inputs);
Backpropagate(tran[i].m_expectedOutputs);

// Check all outputs from neural network against desired values
bool resultCorrect = true;
for (outputIdx = 0; outputIdx < net->m_numOutputs; outputIdx++)
{
if (net->m_clampedOutputs[outputIdx] != tran[i].m_expectedOutputs[outputIdx])
{
resultCorrect = false;
}
MSE += pow((net->m_outputNeurons[outputIdx] - tran[i].m_expectedOutputs[outputIdx]), 2);
}
if (!resultCorrect)
{
//#pragma omp atomic
incorrectEntries++;
}
}

*m_pNetwork = net;


My problem is the sum values are the same each iterations. So what i've not properly done?










share|improve this question




















  • 1





    net is a pointer. In a parallel section, each thread has its own copy of net, however, they all point to the same object. Is Network::evaluate thread-safe?

    – Daniel Langr
    Nov 28 '18 at 13:00











  • @DanielLangr yep that's stupid mistake sorry. Now I've replaced Network * net = m_pNetwork ----> Network net = *m_pNetwork. New problem: sum values are the same each iterations.

    – MrLebovsky
    Nov 28 '18 at 14:00






  • 1





    No idea what these sum values are. However, note that now, net will be after parallel loop set to a single private net of the thread that run the last iteration. Is it what you want? (See lastprivate docs.)

    – Daniel Langr
    Nov 28 '18 at 14:23











  • @DanielLangr same values without lastprivate clause too

    – MrLebovsky
    Nov 28 '18 at 14:45











  • Programming by trying and observing whether it works isn't in my opinion the best approach. Read some good book about OpenMP, or its documentation, or some tutorials before using it.

    – Daniel Langr
    Nov 28 '18 at 14:51
















0















I have a loop which operate with class objects and functions. Also it calculate several sum values. I've try to parallel it with OpenMP:



    Network  net = *m_pNetwork;
TrainingSet tran = trainingSet;
omp_set_num_threads(4);

#pragma omp parallel for reduction(+:MSE, incorrectEntries) firstprivate(tran, net) lastprivate(net) private(outputIdx)
for (int i = 0; i < tran.size(); i++)
{
net->Evaluate(tran[i].m_inputs);
Backpropagate(tran[i].m_expectedOutputs);

// Check all outputs from neural network against desired values
bool resultCorrect = true;
for (outputIdx = 0; outputIdx < net->m_numOutputs; outputIdx++)
{
if (net->m_clampedOutputs[outputIdx] != tran[i].m_expectedOutputs[outputIdx])
{
resultCorrect = false;
}
MSE += pow((net->m_outputNeurons[outputIdx] - tran[i].m_expectedOutputs[outputIdx]), 2);
}
if (!resultCorrect)
{
//#pragma omp atomic
incorrectEntries++;
}
}

*m_pNetwork = net;


My problem is the sum values are the same each iterations. So what i've not properly done?










share|improve this question




















  • 1





    net is a pointer. In a parallel section, each thread has its own copy of net, however, they all point to the same object. Is Network::evaluate thread-safe?

    – Daniel Langr
    Nov 28 '18 at 13:00











  • @DanielLangr yep that's stupid mistake sorry. Now I've replaced Network * net = m_pNetwork ----> Network net = *m_pNetwork. New problem: sum values are the same each iterations.

    – MrLebovsky
    Nov 28 '18 at 14:00






  • 1





    No idea what these sum values are. However, note that now, net will be after parallel loop set to a single private net of the thread that run the last iteration. Is it what you want? (See lastprivate docs.)

    – Daniel Langr
    Nov 28 '18 at 14:23











  • @DanielLangr same values without lastprivate clause too

    – MrLebovsky
    Nov 28 '18 at 14:45











  • Programming by trying and observing whether it works isn't in my opinion the best approach. Read some good book about OpenMP, or its documentation, or some tutorials before using it.

    – Daniel Langr
    Nov 28 '18 at 14:51














0












0








0








I have a loop which operate with class objects and functions. Also it calculate several sum values. I've try to parallel it with OpenMP:



    Network  net = *m_pNetwork;
TrainingSet tran = trainingSet;
omp_set_num_threads(4);

#pragma omp parallel for reduction(+:MSE, incorrectEntries) firstprivate(tran, net) lastprivate(net) private(outputIdx)
for (int i = 0; i < tran.size(); i++)
{
net->Evaluate(tran[i].m_inputs);
Backpropagate(tran[i].m_expectedOutputs);

// Check all outputs from neural network against desired values
bool resultCorrect = true;
for (outputIdx = 0; outputIdx < net->m_numOutputs; outputIdx++)
{
if (net->m_clampedOutputs[outputIdx] != tran[i].m_expectedOutputs[outputIdx])
{
resultCorrect = false;
}
MSE += pow((net->m_outputNeurons[outputIdx] - tran[i].m_expectedOutputs[outputIdx]), 2);
}
if (!resultCorrect)
{
//#pragma omp atomic
incorrectEntries++;
}
}

*m_pNetwork = net;


My problem is the sum values are the same each iterations. So what i've not properly done?










share|improve this question
















I have a loop which operate with class objects and functions. Also it calculate several sum values. I've try to parallel it with OpenMP:



    Network  net = *m_pNetwork;
TrainingSet tran = trainingSet;
omp_set_num_threads(4);

#pragma omp parallel for reduction(+:MSE, incorrectEntries) firstprivate(tran, net) lastprivate(net) private(outputIdx)
for (int i = 0; i < tran.size(); i++)
{
net->Evaluate(tran[i].m_inputs);
Backpropagate(tran[i].m_expectedOutputs);

// Check all outputs from neural network against desired values
bool resultCorrect = true;
for (outputIdx = 0; outputIdx < net->m_numOutputs; outputIdx++)
{
if (net->m_clampedOutputs[outputIdx] != tran[i].m_expectedOutputs[outputIdx])
{
resultCorrect = false;
}
MSE += pow((net->m_outputNeurons[outputIdx] - tran[i].m_expectedOutputs[outputIdx]), 2);
}
if (!resultCorrect)
{
//#pragma omp atomic
incorrectEntries++;
}
}

*m_pNetwork = net;


My problem is the sum values are the same each iterations. So what i've not properly done?







c++ parallel-processing synchronization openmp






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 28 '18 at 14:15







MrLebovsky

















asked Nov 28 '18 at 12:20









MrLebovskyMrLebovsky

14




14








  • 1





    net is a pointer. In a parallel section, each thread has its own copy of net, however, they all point to the same object. Is Network::evaluate thread-safe?

    – Daniel Langr
    Nov 28 '18 at 13:00











  • @DanielLangr yep that's stupid mistake sorry. Now I've replaced Network * net = m_pNetwork ----> Network net = *m_pNetwork. New problem: sum values are the same each iterations.

    – MrLebovsky
    Nov 28 '18 at 14:00






  • 1





    No idea what these sum values are. However, note that now, net will be after parallel loop set to a single private net of the thread that run the last iteration. Is it what you want? (See lastprivate docs.)

    – Daniel Langr
    Nov 28 '18 at 14:23











  • @DanielLangr same values without lastprivate clause too

    – MrLebovsky
    Nov 28 '18 at 14:45











  • Programming by trying and observing whether it works isn't in my opinion the best approach. Read some good book about OpenMP, or its documentation, or some tutorials before using it.

    – Daniel Langr
    Nov 28 '18 at 14:51














  • 1





    net is a pointer. In a parallel section, each thread has its own copy of net, however, they all point to the same object. Is Network::evaluate thread-safe?

    – Daniel Langr
    Nov 28 '18 at 13:00











  • @DanielLangr yep that's stupid mistake sorry. Now I've replaced Network * net = m_pNetwork ----> Network net = *m_pNetwork. New problem: sum values are the same each iterations.

    – MrLebovsky
    Nov 28 '18 at 14:00






  • 1





    No idea what these sum values are. However, note that now, net will be after parallel loop set to a single private net of the thread that run the last iteration. Is it what you want? (See lastprivate docs.)

    – Daniel Langr
    Nov 28 '18 at 14:23











  • @DanielLangr same values without lastprivate clause too

    – MrLebovsky
    Nov 28 '18 at 14:45











  • Programming by trying and observing whether it works isn't in my opinion the best approach. Read some good book about OpenMP, or its documentation, or some tutorials before using it.

    – Daniel Langr
    Nov 28 '18 at 14:51








1




1





net is a pointer. In a parallel section, each thread has its own copy of net, however, they all point to the same object. Is Network::evaluate thread-safe?

– Daniel Langr
Nov 28 '18 at 13:00





net is a pointer. In a parallel section, each thread has its own copy of net, however, they all point to the same object. Is Network::evaluate thread-safe?

– Daniel Langr
Nov 28 '18 at 13:00













@DanielLangr yep that's stupid mistake sorry. Now I've replaced Network * net = m_pNetwork ----> Network net = *m_pNetwork. New problem: sum values are the same each iterations.

– MrLebovsky
Nov 28 '18 at 14:00





@DanielLangr yep that's stupid mistake sorry. Now I've replaced Network * net = m_pNetwork ----> Network net = *m_pNetwork. New problem: sum values are the same each iterations.

– MrLebovsky
Nov 28 '18 at 14:00




1




1





No idea what these sum values are. However, note that now, net will be after parallel loop set to a single private net of the thread that run the last iteration. Is it what you want? (See lastprivate docs.)

– Daniel Langr
Nov 28 '18 at 14:23





No idea what these sum values are. However, note that now, net will be after parallel loop set to a single private net of the thread that run the last iteration. Is it what you want? (See lastprivate docs.)

– Daniel Langr
Nov 28 '18 at 14:23













@DanielLangr same values without lastprivate clause too

– MrLebovsky
Nov 28 '18 at 14:45





@DanielLangr same values without lastprivate clause too

– MrLebovsky
Nov 28 '18 at 14:45













Programming by trying and observing whether it works isn't in my opinion the best approach. Read some good book about OpenMP, or its documentation, or some tutorials before using it.

– Daniel Langr
Nov 28 '18 at 14:51





Programming by trying and observing whether it works isn't in my opinion the best approach. Read some good book about OpenMP, or its documentation, or some tutorials before using it.

– Daniel Langr
Nov 28 '18 at 14:51












0






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',
autoActivateHeartbeat: false,
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%2f53519354%2ffirstprivate-clause-in-openmp-does-not-work%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






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.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53519354%2ffirstprivate-clause-in-openmp-does-not-work%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

A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks

Calculate evaluation metrics using cross_val_predict sklearn

Insert data from modal to MySQL (multiple modal on website)