Влияет ли различная задержка в коде C ++ на время UDP для связи? - PullRequest
0 голосов
/ 23 сентября 2018

Я пытаюсь измерить задержку связи между машиной linux и NVIDIA jetson tk1.На стороне jetson я создал 2 сокета UDP на двух разных портах.Сначала он ожидает сообщение (целое число) от машины linux, используя recvfrom () в неблокирующем режиме, затем выполняет некоторую обработку изображения на GPU и, наконец, отправляет сообщение (снова массив целых чисел) на машину linux.Ниже приведен код на стороне JetsonTK1:

int buf1[20];
while (true)
{
    frame=frame+1;
    while(1)
    {   
        n=recvfrom(sockfd2, buf1, 20, MSG_DONTWAIT,(struct sockaddr *) &clientaddr, &clientlen);
        if(n>0){
            gettimeofday(&tp1, NULL);
            break;
        }
    }

    ////////////////////////////
    /*  Do some image processing 
    This part takes 3ms*/
    ///////////////////////////

    int POS[2]={frame,22};
    numbytes = sendto(sockfd, &POS, sizeof(POS), MSG_DONTWAIT, p->ai_addr, p->ai_addrlen);
    gettimeofday(&tp2, NULL);
    unsigned long msR=1000000*(tp2.tv_sec-tp1.tv_sec)+(tp2.tv_usec-tp1.tv_usec);
    cout<<msR<<endl;
}

На стороне машины Linux у меня есть следующее:

int buf1[20];
while(1)
{
    int A=1;

    //usleep(1000);
    usleep(1000000);

    int POS[2]={1,1};
    sendto(sockfd,  &A, sizeof(A), MSG_DONTWAIT, p->ai_addr, p->ai_addrlen);

    gettimeofday(&tp1R,NULL);
    while(1)
    {
        n=recvfrom(sockfd2, buf1, 20, MSG_DONTWAIT,(struct sockaddr *) &clientaddr, &clientlen);
        if(n>0){
            gettimeofday(&tp2R,NULL);
            unsigned long msR= 1000000*(tp2R.tv_sec-tp1R.tv_sec)+(tp2R.tv_usec-tp1R.tv_usec) ;
            cout<<buf1[0]<<" "<<buf1[1]<<" "<<msR<<endl;    
            break;
        }
    }
}

Все измерения выполняются с использованием функции gettimeofday() в C ++.Как вы можете видеть, у меня есть задержка на стороне машины linux usleep() 1 секунда. В основном машина linux отправляет сообщение JetsonTK1 для захвата изображения и выполнения обработки, и, наконец, получает сообщение от Jetson о том, что обработка изображения выполняется.сделано для этого кадра, а затем задержка и повторение той же процедуры. Я измеряю время от момента отправки пакета с машины linux до получения подтверждения того, что обработка выполнена.При расчете времени с обеих сторон с этой задержкой в ​​1 секунду задержка превышает 11 мс.Однако, когда я меняю задержку от 1 секунды до 100 мс в usleep (), время, которое я получаю с обеих сторон, составляет 3 мс, что эквивалентно времени для обработки изображения на стороне JetsonTK1.Как и почему это происходит?какое отношение эта задержка имеет к задержке от отправки к приему в UDP-сокетах?Я также пытался использовать блокирующий режим приема, но он ничего не изменил ... Это как-то связано с обработкой на GPU?

Я знаю, что эти задержки так или иначе связаны с планировщиком ЦП, но он работает в масштабе наносекунд, и простое UDP-сообщение не должно занимать 11 мсек, чтобы прибыть ...

...