разница во времени исполнения в C - PullRequest
0 голосов
/ 02 февраля 2020

Я пишу код для сложения векторов в C. Я получаю ошибку сегментации , когда я передаю аргументы как 10 миллионов.

Я знаю, что ошибка сегментации возникает, когда мы обращаемся к адресу памяти вне адресного пространства процесса.

Но я не думаю, что здесь это не является причиной.

Мой код:

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
struct timeval stop, start,start1,stop1;
void add(int a[], int b[],int N);

int main(int argc, char* argv[]){

    gettimeofday(&start1, NULL);

    if(argc<2){
        printf("Please enter the value of N(number of elements)\n");
    }else{
        int i,N;
        N=atoi(argv[1]);
        N=N*1024;   
        int a[N],b[N];
        for(i=0;i<=N;i++){
            a[i]=rand()%1000;
            b[i]=rand()%1000;
        }
        gettimeofday(&start, NULL);
        add(a,b,N);
        gettimeofday(&stop, NULL);
        printf("took %lu us\n", (stop.tv_sec - start.tv_sec) * 1000000 + stop.tv_usec - start.tv_usec);
    }
    gettimeofday(&stop1, NULL);
    printf("Total took %lu us\n", (stop1.tv_sec - start1.tv_sec) * 1000000 + stop1.tv_usec - start1.tv_usec);
    return 0;
}

void add(int a[], int b[], int N){
    int c,i;
    for(i=0;i<=N;i++){
        c=a[i]+b[i];
        // printf("%d + %d = %d\n",a[i],b[i],c);
    }
}

И вывод выглядит следующим образом : (Аргументом команды является размер массива)

$ ./vectorAdd 1
took 9 us
Total took 233 us

$ ./vectorAdd 10
took 93 us
Total took 918 us

$ ./vectorAdd 100
took 210 us
Total took 4974 us

$ ./vectorAdd 1000
took 2371 us
Total took 20277 us

$ ./vectorAdd 10000
Segmentation fault (core dumped)

1 Ответ

0 голосов
/ 05 февраля 2020

Я попробовал это, и это работает. Спасибо за все ваши ответы. Это действительно помогло мне. Если есть какая-либо оптимизация, пожалуйста, дайте мне знать Выход:

$ ./vectorAdd 10000
took 34853 us
Total took 246023 us

#include<stdio.h>
#include<stdlib.h>
#include <sys/time.h>
struct timeval stop, start,start1,stop1;
void add(int *a, int *b, int *c, int N);
int *a, *b ,*c;

int main(int argc,char* argv[]){
    gettimeofday(&start1, NULL);
    if(argc<2){
        printf("Please enter the value of N(number of elements)\n");
    }
    else
    {
        int i,N=0;
        N=atoi(argv[1]);
        N=N*1024;
        a=(int *)malloc(N * sizeof(int));
        b=(int *)malloc(N * sizeof(int));
        c=(int *)malloc(N * sizeof(int));
        for(i=0;i<N;i++){
            a[i]=rand()%1000;
            b[i]=rand()%1000;
        }
        gettimeofday(&start, NULL);
        add(a,b,c,N);
        gettimeofday(&stop, NULL);
        printf("took %lu us\n", (stop.tv_sec - start.tv_sec) * 1000000 + stop.tv_usec - start.tv_usec);
        free(a);
        free(b);
        free(c);
    }
    gettimeofday(&stop1, NULL);
    printf("Total took %lu us\n", (stop1.tv_sec - start1.tv_sec) * 1000000 + stop1.tv_usec - start1.tv_usec);
    return 0;
}

void add(int *a, int *b,int *c, int N){
    int i;
    for(i=0;i<=N;i++){
        c[i]=a[i]+b[i];
        // printf("%d + %d = %d\n",a[i],b[i],c[i]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...