Вот часть моего кода, которая работает параллельно:
timer.Start();
for(int i = 0; i < params.epochs; ++i)
{
#pragma omp for
for(int j = 0; j < min_net; ++j)
{
std::pair<CVectorSSE,CVectorSSE>& sample = data_set[j];
nets[j]->Approximate(sample.first,net_outputs[j]);
out_gradients[j].SetDifference(net_outputs[j],sample.second);
nets[j]->BackPropagateGradient(out_gradients[j],net_gradients[j]);
}
}
timer.Stop();
эпох = 100
У меня AMD Athlon X2 5000 +
Когда я запускаю этот код без директивы omp, время такое же ...
И когда я смотрю на диспетчере задач / производительности при запуске обеих программ (с / без omp)
в обоих случаях используются 2 ядра ... Так что кажется, что VS (VS 2008) каким-то образом оптимизирует код, как omp ???
Код внутри параллельного цикла использует инструкции SSE ...
Мне было интересно, что, возможно, в многоядерных процессорах есть только один модуль SSE, но это было бы глупо ...
Так, может быть, кто-нибудь может сказать мне, что я делаю не так?
Я знаю, что это зависит от моего кода внутри цикла, но если этот код внутри параллелен, то он ДОЛЖЕН ускориться ...
Хорошо, я определенно делаю что-то не так - посмотрите на этот код:
time_t start;
time_t stop;
start = time(NULL);
#pragma omp for
for(int i = 0; i < 10; ++i)
{
Sleep(1000);
}
stop = time(NULL);
cout<<difftime(stop,start)<<endl;
без omp он должен спать в течение 10 секунд (10 * 1000 мс)
с omp он должен спать менее 10 секунд, потому что 2 потока могут спать одновременно, верно?
НО он снова спит 10 секунд - как это возможно?