В настоящее время я впервые использую openMP и ударился головой о том, что «члены данных не могут быть приватными».
Хотелось бы узнать, действительно ли нижеприведенное, или оно в итоге сломается:
class network
{
double tau;
void SomeFunction();
};
void network::SomeFunction()
{
#pragma omp parallel for // <-the openMP call
for (uint iNeu=0;iNeu<nNeurons;++iNeu)
{
neurons[iNeu].timeSinceSpike+=tau; //tau is defined in some other place
neurons[iNeu].E+=tau*tau;
}
}
Итак, я использую минимальный синтаксис и позволяю openMP разобраться во всем самостоятельно. Эта версия компилируется, и вывод правильный (пока).
То, что я пробовал до этого, было
void network::SomeFunction()
{
#pragma omp parallel for default(none) shared(neurons) firstprivate(tau) // <-the openMP call
for (uint iNeu=0;iNeu<nNeurons;++iNeu)
{
neurons[iNeu].timeSinceSpike+=tau; //tau is defined in some other place
neurons[iNeu].E+=tau*tau;
}
}
Однако, как намекнул, это не скомпилируется, вероятно потому, что тау и нейроны являются членами данных сети.
Тогда возникает вопрос: действительно ли мне просто повезло в моих прогонах первой версии, и должен ли я сделать что-то вроде
void network::SomeFunction()
{
double tempTau=tau;
vector <neuron> tempNeurons=neurons; //in realtity this copy-process would be quite involved
#pragma omp parallel for shared(tempNeurons) firstprivate(tempTau)// <-the openMP call
for (uint iNeu=0;iNeu<nNeurons;++iNeu)
{
tempNeurons[iNeu].timeSinceSpike+=tempTau;
tempNeurons[iNeu].E+=tempTau*tempTau;
}
}
Естественно, я бы предпочел придерживаться текущей версии, так как она такая короткая и легко читаемая, но я также хотел бы доверять своему выводу :)
Я использую GCC 4.6.1
Надеюсь, кто-то может научить меня, как правильно это сделать.