C ++代码中的不同延迟是否会影响UDP通信时序?

时间:2018-09-23 14:11:28

标签: c++ linux sockets udp latency

我试图测量Linux机器与NVIDIA jetson tk1之间的通信延迟。在jetson端,我在两个不同的端口上创建了2个UDP套接字。首先,它在非阻塞模式下使用recvfrom()等待来自Linux机器的消息(整数),然后在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;
        }
    }
}

所有测量均使用C ++中的gettimeofday()函数完成。如您所见,我在Linux机器端usleep()上有1秒的延迟。基本上,Linux机器向JetsonTK1发送一条消息以捕获图像并进行处理,最后它从Jetson接收到该图像的消息处理是针对该帧完成的,然后是延迟并重复相同的过程。我正在测量从Linux机器发送数据包到收到确认已完成处理的时间。当以这1秒钟的延迟计算双方的时序时,延迟会超过11毫秒。但是,当我在usleep()中将延迟从1秒更改为100ms时,两边的时间都是3ms,这与JetsonTK1端的图像处理时间相同。这是怎么发生的以及为什么发生的?此延迟与UDP套接字中从发送到接收的延迟有什么关系?我也尝试过使用接收的阻止模式,但是它没有改变任何东西……这是否与GPU处理有关?

我知道这些延迟在某种程度上与CPU调度程序有关,但是可以以纳秒为单位工作,并且一条简单的UDP消息就不需要11ms的时间到达...

0 个答案:

没有答案