Я пытаюсь измерить задержку связи между машиной 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 мсек, чтобы прибыть ...