2017-01-04 1 views
-2

유전 코드가 있고 12 코어에 병렬로 쓰고 싶습니다. 첫 번째 부분은 병렬 처리하기를 원하지만 병렬 및 실행 후 직렬 코드가 병렬보다 빠릅니다. 코드, 내가 틀린 곳을 말해줘. sermp보다 openmp가 더 빠른 방법이 있습니까?왜 직렬 실행이 더 빠릅니다 병렬 openmp

int main() { 

srand(time(0)); 
srand(rand() % 10000007); 
G.vertex_degrees(); 
int step = 0, n_pop = 100; 

G.initial_population(n_pop);//parallel shod 
G.full_random_array();//movazi shod 
clock_t start = clock(); 
int i = 0,tid,nthreads; 
#pragma omp parallel for 
for (i = 0; i < n_pop; i++) { 
    G.Chromosome_Repairing_Method(i); 
    G.Fitness(i); 
} 
//cout << "MC Size :" << G.current_Bc_size << " with Time (precise) = " << ((double)(clock() - start))/CLOCKS_PER_SEC << "found it" << endl; 
omp_set_num_threads(4); 

G 유전자 알고리즘과 G.Chromosome_Repairing_Method (I)의 목적은; 은 염색체 및 G.Fitness (i)를 복구하는 기능입니다. 은 각 염색체의 적합성을 계산하는 함수입니다.

+1

Chromosome_Repairing_Method(), Fitness()의 기간은 얼마나됩니까? 그들은 더 나은 반복을 위해 많은 시간을 필요로합니다. – coincoin

+0

for 루프에서 * i *를 선언해야하는지 궁금합니다. for (int i = 0, ...). for 루프의 범위 밖에 있기 때문에 이것이 문제의 원인 일 수 있습니다. – rcgldr

+1

어쩌면 코드 시간을 측정하는 방법으로 인해 문제가 발생할 수 있습니다. [this] (http://stackoverflow.com/a/10674970/5239503) 또는 [that] (http://stackoverflow.com/a/10736858)/5239503) – Gilles

답변

0

병렬화 작업에는 시간이 걸립니다.

당신은 실생활과 3 명의 작업자로 작업을 해본 경험이 있으며 "나는 세 사람에게해야 할 일을 설명하는 것보다 빠를 것입니다.

글쎄, 같은 일이 일어 났을 수도 있습니다. "그냥하고있는"한 사람은 여러 사람이 조직하고, 그것을하고, 결과를 병합하기 위해 다시 조직하는 것보다 빠릅니다.

평행을 다하는 것은 아무 것도 아닙니다. 작업에 적합해야하거나 오버 헤드 만 추가 할 수 있습니다.