我试图测量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的时间到达...