UltraGrid
UltraGrid Low-Latency High-Resolution Transmission System
Loading...
Searching...
No Matches
ldgm-session-cpu.cpp File Reference
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "ldgm-session-cpu.h"
#include "timer-util.h"
#include <errno.h>
Include dependency graph for ldgm-session-cpu.cpp:

Go to the source code of this file.

Macros

#define aligned_free   free
 

Functions

static void * aligned_malloc (size_t size, size_t alignment)
 
void iterate (Tanner_graph *g)
 
static char * xor_using_sse (char *source, char *dest, int packet_size)
 

Macro Definition Documentation

◆ aligned_free

Function Documentation

◆ aligned_malloc()

static void * aligned_malloc ( size_t size,
size_t alignment )
inlinestatic

Definition at line 38 of file ldgm-session-cpu.cpp.

39{
40 void *ptr = NULL;
41 int ret;
42 ret = posix_memalign(&ptr, alignment, size);
43 if(ret) {
44 errno = ret;
45 }
46
47 if(ret == 0) {
48 return ptr;
49 } else {
50 return NULL;
51 }
52}

Referenced by LDGM_session_cpu::alloc_buf(), aligned_data_allocator::allocate(), vidcap_state_aja::CaptureFrames(), LDGM_session_cpu::encode(), LDGM_session_cpu::encode_naive(), vf_alloc_desc_data(), and video_reader_callback().

◆ iterate()

void iterate ( Tanner_graph * g)

◆ xor_using_sse()

static char * xor_using_sse ( char * source,
char * dest,
int packet_size )
static

Definition at line 58 of file ldgm-session-cpu.cpp.

59{
60 // int a = 0;
61 // int II = packet_size % 16;
62 // a=II*16;
63 // // uint64_t* p1 = (uint64_t*) (source);
64 // // uint64_t* p2 = (uint64_t*) (dest);
65
66 // __int128* p1 = (__int128*) (source);
67 // __int128* p2 = (__int128*) (dest);
68
69 // for(int i=0; i<II; i++){
70 // *p2 ^= *p1;
71 // p2++;
72 // p1++;
73 // }
74 // while(a<packet_size){
75 // *(dest + a) ^= *(source+a);
76 // a++;
77 // }
78 //First, do as many 128-bit XORs as possible
79 int iter_bytes_16 = 0;
80 int iter_bytes_4 = 0;
81 int iter_bytes_1 = 0;
82#if defined __SSE2__ || _M_IX86_FP == 2
83 iter_bytes_16 = (packet_size/16)*16;
84
85 if ( iter_bytes_16 > 0)
86 {
87
88 // printf ( "iter_bytes: %d\n", iter_bytes );
89 __m128i* wrd_ptr = (__m128i *)(void *) source;
90 __m128i* wrd_end = (__m128i *)(void *) (source + iter_bytes_16);
91 __m128i* dst_ptr = (__m128i *)(void *) dest;
92
93 // printf ( "wrd_ptr address: %p\n", wrd_ptr );
94 do
95 {
96 __m128i xmm1 = _mm_loadu_si128(wrd_ptr);
97 __m128i xmm2 = _mm_loadu_si128(dst_ptr);
98
99 xmm1 = _mm_xor_si128(xmm1, xmm2); // XOR 4 32-bit words
100 _mm_storeu_si128(dst_ptr, xmm1);
101 ++wrd_ptr;
102 ++dst_ptr;
103
104 } while (wrd_ptr < wrd_end);
105 }
106#endif
107 //Check, whether further XORing is necessary
108 if ( iter_bytes_16 < packet_size )
109 {
110 char *mark_source = source + iter_bytes_16;
111 char *mark_dest = dest + iter_bytes_16;
112
113 iter_bytes_4 = ((packet_size - iter_bytes_16)/4)*4;
114
115 for ( int i = 0; i < (packet_size - iter_bytes_16)/4; i++)
116 {
117 int *s = ((int*)(void *) mark_source) + i;
118 int *d = ((int*)(void *) mark_dest) + i;
119 *d ^= *s;
120 }
121
122 mark_source += iter_bytes_4;
123 mark_dest += iter_bytes_4;
124
125 iter_bytes_1 = packet_size - iter_bytes_16 - iter_bytes_4;
126
127 for ( int i = 0; i < iter_bytes_1; i++)
128 {
129 *(mark_dest + i) ^= *(mark_source+i);
130 }
131 }
132
133// printf ( "XORed: %d bytes using SSE, %d bytes as ints and %d bytes byte-per-byte.\n",iter_bytes_16, iter_bytes_4, iter_bytes_1);
134
135 return dest;
136}
struct _source source
Definition rtp.c:206

Referenced by LDGM_session_cpu::encode(), and LDGM_session_cpu::iterate().