0

저는 여기에서 새로 왔으며 일반적으로 프로그래밍에서 상대적으로 새로운 것 같습니다. 나는 C로 프로그램을 작성했으며 pthread를 사용하여 가속화 할 필요가있다. 나는 OpenMP를 사용하여 그렇게하려고 시도했지만 디버깅하는 방법을 모른다. 또한 프로그래머가 pthreads 및 시간을 사용하여 더 빠르면 알아낼 필요가 있지만 코드에서이 코드를 작성하는 방법을 모르겠습니다. 여기에 내 코드 내 엉망 메일pthread를 사용하여 C 프로그램을 가속화하십시오.

enter code here 
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <pthread.h> 
#define NTHREADS 2 
#define FYLLO(komvos) ((komvos) * 2 + 1) 

long factorial(long); 
void heap_function (int [], int, int); 
void make_heap(long [], int); 
void pop_heap(long [], int); 

struct thread_data 
{ 
long int n; 
long int k; 
long *b; 
}; 

main() 
{ 

    long int n,k,c,fact=1; 
    long *a,*b,*d,p[k]; 
    int i,j,rc; 
    int q[]={2,3,4,5,6,7,8,9,12,13,14,15,16}; 
    pthread_t thread[NTHREADS]; 
    struct thread_data threada; 
    for(i=0;i<NTHREADS;i++) 
    { 
    threada.n=n; 
    threada.k=k; 
    threada.b=b; 
    pthread_create (&thread[i], NULL, (void *)&threada); 
    } 
    for (i=0; i<NTHREADS; i++) 
    rc = pthread_join (thread[i], NULL); 

    for(i=0;i<13;i++) 
    { 
    k=pow(2,q[i])-1; 
    if(a=(long*)malloc(i*sizeof(long))==NULL); 
    { 
     printf("Den yparxei diathesimi mnimi gia desmeusi\n"); 
     exit(1); 
    } 
    a[i]=k; 
    for(a[0];a[13];a[i]++) 
    { 
     n=(pow(2,q[i]))*k; 
     if(d=(long*)malloc((i*i)*sizeof(long))==NULL); 
     { 
      printf("Den yparxei diathesimi mnimi gia desmeusi\n"); 
      exit(1); 
     } 
     d[i]=n; 
    } 
    c=(factorial(n))/((factorial(k))*(factorial(n-k)));  
    } 
    if(b=(long*)malloc(((i*i)+i)*sizeof(long))==NULL) 
    { 
     printf("Den yparxei diathesimi mnimi gia desmeusi\n"); 
     exit(1); 
    } 
    for(i=0;i<13;i++) 
    { 
    b[i]=a[i]; 
    } 
    for(i=13;i<182;i++)      /* Gia i=13 exoume i^2=169 kai i^2+i=182*/ 
    { 
    b[i]=d[i]; 
    }  
    long heap[sizeof(b)]; 
    make_heap(heap, sizeof(b)); 
    printf("To heap einai:\n");   
    for (i = sizeof(b); i >=0; i--) 
     { 
      printf("%d ", heap[0]); 
      pop_heap(heap, i); 
     } 
    for(i=(n-k);i<=n;i++) 
     for(j=0;j<k;j++) 
     { 
      p[j]=heap[i]; 
      printf("Ta %d mikrotera stoixeia eina ta %ld\n",k,p[j]); 
     } 
    free((void*)b);    
    getch(); 
} 



long factorial(long n) 
{ 
    int a; 
    long result=1; 

    for(a=1;a<=n;a++) 
    result=result*a; 

    return(result); 
} 



void heap_function(int a[], int i, int n) 
{ 

    while (FYLLO(i) < n)     /* Vazoume sto heap ta stoixeia san   ypodentra */ 
{ 

    int fyllo = FYLLO(i); 


    if (fyllo + 1 < n && a[fyllo] < a[fyllo + 1])  /* Dialegoume to maegalytero apo ta dyo paidia komvous */ 
    ++fyllo; 


    if (a[i] < a[fyllo])      /* Metaferoume to megalytero komvo sti riza */ 
    { 
    int k = a[i]; 
    a[i] = a[fyllo]; 
    a[fyllo] = k; 
    } 


    ++i;         /* Synexizoume ston epomeno komvo */ 
    } 
} 


void make_heap(long a[], int n)  /*Dhmioyrgoume ti sinartisi make_heap gia na mporesoume na valoume ta 
             stoixeia pou dwsame mesa sto heap kai na ta ta3inomisoume*/ 
{ 
    int i = n/2; 

    while (i-- > 0) 
    heap_function(a, i, n); 
} 


void pop_heap(long heap[], int n)  /*Dhmiourgoume ti sinartisi pop_heap gia na mporesoume na e3agoume 
             ta stoixeia apo to heap apo to megalytero sto mikrotero*/ 
{ 
    long k = heap[0]; 
    heap[0] = heap[n]; 
    heap[n] = k; 
    heap_function(heap, 0, n);   /*Afou emfanistei to prwto stoixeio kaloume ti sinartisi heap_function 
             gia na ta3inomisei ta stoixeia pou menoun sto heap*/ 
} 

죄송합니다,하지만 난 그녀가 지금은

답변

5

추가 스레드 프로그램을 가속화 할 수 없습니다 그것을 사용하는지고있어 새로운 해요, 당신이 구성 할 수 있습니다 당신의 병렬로 실행될 수있는 실행 단위로 작업합니다 (멀티 코어 시스템에서는 일반적으로 병렬로 실행될 수 있음). 멀티 코어 시스템을 사용하고 있지 않다면 다른 스레드가 계속 실행될 수 있기 때문에 하나 이상의 스레드가 느린 입력을 기다리는 것을 차단해야하는 경우 여전히 이점을 얻을 수 있습니다. 실제 프로그램에 따라 더 빠른 런타임을 제공 할 수도 그렇지 않을 수도 있습니다.

일반적으로 스레드 디버깅은 단일 스레드를 디버깅하는 것보다 어렵습니다. 수행 방법은 사용 가능한 도구에 따라 다릅니다. 디버거가 작업을 쉽게 수행 할 수없는 경우 먼저 프로그램을 순차적으로 실행하도록 권장합니다. 여전히 스레드 모델을 사용하여 중단하고 각 스레드의 코드를 기본 스레드에서 실행하여 실행되도록합니다. 당신의 모델이 이것을 허락한다면, 완성 될 때까지. 스레드가 런타임 중에 서로 의존하기 때문에 많은 스레드 응용 프로그램은 그렇게 작성할 수 없지만 정확히 무엇을하고 있는지에 달려 있습니다.

귀하의 특정 상황에 대해 - 당신은 아직 어떻게 수영해야할지 모를 때 깊은 끝으로 뛰어 들어 가고 있습니다. 나는 당신이 왜 필요로하는지의 복잡성없이 쓰레드를 사용하는 법을 배웠다면, 그렇지 않으면 문제가 더 복잡 할 수 밖에 없다는 것을 알았습니다. http://cs.gmu.edu/~white/CS571/Examples/Pthread/create.c에는 간단한 예제가 있습니다. pthread_create() 호출의 매개 변수를 특히주의 깊게 살펴보고 수행 한 것과 비교하십시오. 코드에서 스레드로 실행되는 세 번째 매개 변수가 누락되었습니다. 그러한 함수가 전혀없는 것처럼 보입니다. 대신에 pthread_create()을 호출 한 다음 코드가 병렬로 실행되는 코드라고 생각되는 것 같습니다. 이것은 fork()이 작동하는 방식이지만 매우 다릅니다.

시작하면 충분합니다. http://cs.gmu.edu/~white/CS571/Examples/pthread_examples.html에는 추가 예제가 있으며 "pthread tutorial"의 google이 도움이 될 것입니다.

+2

스레드 추가 _may_ 프로그램 가속화가 더 나은 용어 일 수 있습니다. –

+0

@Pavan Manjunath - true. 내 글을 업데이트했습니다. – mah

+0

답변 해 주셔서 감사합니다. 문제는이 프로그램에서 pthread를 사용해야한다는 것입니다. 더 잘 이해하려고 노력할 것이고 더 궁금한 점이 있습니다. – Vasouli

관련 문제