37__global__
void frame_encode_int_big(
int *data,
int *pcm,
int param_k,
int param_m,
int w_f,
int packet_size);
39__global__
void frame_encode_staircase(
int *data,
int *pcm,
int param_k,
int param_m,
int w_f,
int packet_size);
41__global__
void frame_decode(
char * received,
int * pcm,
int * error_vec,
int * sync_vec,
int packet_size,
int max_row_weight,
int K);
43__global__
void frame_encode_int(
int *data,
int *pcm,
int param_k,
int param_m,
int w_f,
int packet_size);
45__global__
void frame_decode_int(
int * received,
int * pcm,
int * error_vec,
int * sync_vec,
int packet_size,
int max_row_weight,
int K);
51__device__
unsigned int count = 0;
56 int iter_bytes_16 = 0;
60 iter_bytes_16 = (packet_size / 16) * 16;
62 if ( iter_bytes_16 > 0)
66 __m128i *wrd_ptr = (__m128i *)
source;
67 __m128i *wrd_end = (__m128i *) (
source + iter_bytes_16);
68 __m128i *dst_ptr = (__m128i *) dest;
73 __m128i xmm1 = _mm_loadu_si128(wrd_ptr);
74 __m128i xmm2 = _mm_loadu_si128(dst_ptr);
76 xmm1 = _mm_xor_si128(xmm1, xmm2);
77 _mm_storeu_si128(dst_ptr, xmm1);
82 while (wrd_ptr < wrd_end);
85 if ( iter_bytes_16 < packet_size )
87 char *mark_source =
source + iter_bytes_16;
88 char *mark_dest = dest + iter_bytes_16;
90 iter_bytes_4 = ((packet_size - iter_bytes_16) / 4) * 4;
92 for (
int i = 0; i < (packet_size - iter_bytes_16) / 4; i++)
94 int *s = ((
int *) mark_source) + i;
95 int *d = ((
int *) mark_dest) + i;
99 mark_source += iter_bytes_4;
100 mark_dest += iter_bytes_4;
102 iter_bytes_1 = packet_size - iter_bytes_16 - iter_bytes_4;
104 for (
int i = 0; i < iter_bytes_1; i++)
106 *(mark_dest + i) ^= *(mark_source + i);
113void gpu_encode_upgrade (
char * source_data,
int *OUTBUF,
int * PCM,
int param_k,
int param_m,
int w_f,
int packet_size ,
int buf_size)
117 int blocksize = packet_size/
sizeof(int);
120 if(blocksize>1024) blocksize=1024;
123 cuda_check_error(
"frame_encode_int_big");
126 cuda_check_error(
"frame_encode_staircase");
128 cudaMemcpy(source_data + param_k*packet_size,OUTBUF + (param_k*packet_size)/4, param_m*packet_size,cudaMemcpyDeviceToHost );
130 cuda_check_error(
"memcpy out_buf");
149 cuda_check_error(
"frame_encode_int");
151 cudaMemcpy(source_data + param_k*packet_size,OUTBUF + (param_k*packet_size)/4, param_m*packet_size,cudaMemcpyDeviceToHost );
153 cuda_check_error(
"memcpyu out_buf");
155 for (
int m = 1; m < param_m; ++m)
157 char *prev_parity = (
char *) source_data + (param_k + m - 1) * packet_size;
158 char *parity_packet = (
char *) source_data + (param_k + m) * packet_size;
187#define CHECK_CUDA(cmd) do { \
188 cudaError_t err = cmd; \
189 if (err != cudaSuccess) {\
190 fprintf(stderr, "[LDGM GPU] %s: %s\n", #cmd, cudaGetErrorString(err)); \
194void gpu_decode_upgrade(
char *data,
int * PCM,
int* SYNC_VEC,
int* ERROR_VEC,
int not_done,
int *frame_size,
int * error_vec,
int * sync_vec,
int M,
int K,
int w_f,
int buf_size,
int packet_size)
207 int* received = (
int*) data;
212 error = cudaHostRegister(received, buf_size, cudaHostRegisterMapped);
215 error = cudaHostGetDevicePointer((
void **) & (received_d), (
void *)received, 0);
243 int ps = packet_size/
sizeof(int);
245 int blocksize = packet_size/
sizeof(int) +1;
247 if(blocksize>512) blocksize=512;
249 int not_done_source=0;
250 for (
int i = 0; i < K; i++)
252 if (error_vec[i] == 1) not_done_source++;
258 unsigned int count_host = 0;
259 unsigned int count_host_M = 0;
266 for (i = 1; i < 30; ++i)
276 error = cudaMemcpyFromSymbol((
void*)(&count_host),
count,
sizeof(
unsigned int), 0, cudaMemcpyDeviceToHost);
280 if (count_host == not_done_source)
286 CHECK_CUDA(cudaMemcpyFromSymbol((
void*)(&count_host_M),
count_M,
sizeof(
unsigned int), 0, cudaMemcpyDeviceToHost));
288 if (count_host_M == M)
309 for (
int i = 0; i < K; i++)
311 if (error_vec[i] == 1) a++;
322 memcpy(&fs, received, 4);
342 int ps = packet_size/
sizeof(int);
350 extern __shared__
int parity_packet[];
364 for (
int i = 0; i < w_f; i++)
366 int idx = pcm[bx * w_f + i];
370 if (idx > -1 && idx < param_k)
387 data[(param_k + bx) * ps +
offset]= parity_packet[
offset];
394__global__
void frame_encode_int(
int *data,
int *pcm,
int param_k,
int param_m,
int w_f,
int packet_size)
396 int ps = packet_size/
sizeof(int);
404 extern __shared__
int parity_packet[];
418 for (
int i = 0; i < w_f; i++)
420 int idx = pcm[bx * w_f + i];
424 if (idx > -1 && idx < param_k)
446 data[(param_k + bx) * ps +
offset]= parity_packet[
offset];
452__global__
void frame_decode_int(
int *received,
int *pcm,
int *error_vec,
int *sync_vec,
int packet_size,
int max_row_weight,
int K)
456 __shared__
int undecoded;
457 __shared__
int undecoded_index;
461 extern __shared__
int shared_parity_packet[];
462 int w_f = max_row_weight + 2;
463 int ps = packet_size;
474 undecoded_index = -1;
475 for (
int j = 0; j < w_f; j++)
477 int p = pcm[bx * w_f + j];
479 if (p != -1 && error_vec[p] == 1)
487 ret = atomicCAS(sync_vec + undecoded_index, 1, 0);
500 shared_parity_packet[
offset]=0x0;
511 for (
int j = 0; j < w_f; j++)
513 int index = pcm[bx * w_f + j];
514 if (index != undecoded_index && index != -1)
519 shared_parity_packet[
offset] ^= received[index*ps +
offset];
538 received[(undecoded_index * ps) +
offset] = shared_parity_packet[
offset];
550 if (x == 0 && ret == 1)
553 atomicCAS(error_vec + undecoded_index, 1, 0);
556 if (x == 0 && ret==1 && undecoded_index<K)
558 atomicAdd(&
count, 1);
560 if (x == 0 && undecoded!=1 )
573 int ps = packet_size/
sizeof(int);
577 for (
int index = param_k; index < param_k + param_m-1; index++)
static __device__ const float offset
#define cudaMemcpyHostToDevice
#define cudaGetErrorString
__global__ void frame_decode(char *received, int *pcm, int *error_vec, int *sync_vec, int packet_size, int max_row_weight, int K)
__device__ unsigned int count
void gpu_encode(char *source_data, int *pc_matrix, struct coding_params *)
__global__ void frame_encode_int(int *data, int *pcm, int param_k, int param_m, int w_f, int packet_size)
__global__ void frame_encode(char *data, int *pcm, struct coding_params *params)
void gpu_decode(char *received, int *pcm, struct coding_params *params, int *error_vec, int *sync_vec, int undecoded, int *frame_size)
void gpu_encode_upgrade(char *source_data, int *OUTBUF, int *PCM, int param_k, int param_m, int w_f, int packet_size, int buf_size)
char * xor_using_sse2(char *source, char *dest, int packet_size)
__device__ unsigned int count_M
__global__ void frame_encode_staircase(int *data, int *pcm, int param_k, int param_m, int w_f, int packet_size)
__global__ void frame_encode_int_big(int *data, int *pcm, int param_k, int param_m, int w_f, int packet_size)
void gpu_decode_upgrade(char *data, int *PCM, int *SYNC_VEC, int *ERROR_VEC, int not_done, int *frame_size, int *error_vec, int *sync_vec, int M, int K, int w_f, int buf_size, int packet_size)
__global__ void frame_decode_int(int *received, int *pcm, int *error_vec, int *sync_vec, int packet_size, int max_row_weight, int K)