summaryrefslogtreecommitdiff
path: root/src/compression/xtc2.c
diff options
context:
space:
mode:
authorMagnus Lundborg <lundborg.magnus@gmail.com>2014-07-21 13:56:54 (GMT)
committerMagnus Lundborg <lundborg.magnus@gmail.com>2014-07-23 22:17:52 (GMT)
commit1a09f345860834fb1c2005e65948fa296b201e8b (patch)
treefb25ea8a08d34fa2ca2298792ef8e559841932a7 /src/compression/xtc2.c
parent3e2c4306bba827d5b1d3444d5fb9a81e4b2a88bb (diff)
Improved TNG compression speed.
Change-Id: I71c66c6b534cb402048dcd75e008d3db4bd3fb71
Diffstat (limited to 'src/compression/xtc2.c')
-rw-r--r--src/compression/xtc2.c120
1 files changed, 72 insertions, 48 deletions
diff --git a/src/compression/xtc2.c b/src/compression/xtc2.c
index bbd45e9..e5b688a 100644
--- a/src/compression/xtc2.c
+++ b/src/compression/xtc2.c
@@ -1,7 +1,7 @@
/* This code is part of the tng compression routines.
*
- * Written by Daniel Spangberg
- * Copyright (c) 2010, 2013, The GROMACS development team.
+ * Written by Daniel Spangberg and Magnus Lundborg
+ * Copyright (c) 2010, 2013-2014 The GROMACS development team.
*
*
* This program is free software; you can redistribute it and/or
@@ -26,6 +26,12 @@
/* Generated by gen_magic.py */
#define MAX_MAGIC 92
+#ifdef USE_WINDOWS
+#define TNG_INLINE __inline
+#else
+#define TNG_INLINE inline
+#endif
+
static unsigned int magic[MAX_MAGIC]={
2U, 3U, 4U, 5U,
6U, 8U, 10U, 12U,
@@ -159,20 +165,43 @@ static const double iflipgaincheck=0.89089871814033927; /* 1./(2**(1./6)) */
#define SHOWIT
#endif
+#ifdef USE_WINDOWS
+#define TNG_INLINE __inline
+#else
+#define TNG_INLINE inline
+#endif
+
int Ptngc_magic(unsigned int i)
{
return magic[i];
}
-int Ptngc_find_magic_index(unsigned int maxval)
+TNG_INLINE int Ptngc_find_magic_index(const unsigned int maxval)
{
- int i=0;
+ int i;
+
+ if(maxval > magic[MAX_MAGIC/4])
+ {
+ if(maxval > magic[MAX_MAGIC/2])
+ {
+ i = MAX_MAGIC/2 + 1;
+ }
+ else
+ {
+ i = MAX_MAGIC/4 + 1;
+ }
+ }
+ else
+ {
+ i = 0;
+ }
+
while (magic[i]<=maxval)
i++;
return i;
}
-static unsigned int positive_int(int item)
+TNG_INLINE static unsigned int positive_int(const int item)
{
int s=0;
if (item>0)
@@ -182,7 +211,7 @@ static unsigned int positive_int(int item)
return s;
}
-static int unpositive_int(int val)
+TNG_INLINE static int unpositive_int(const int val)
{
int s=(val+1)/2;
if ((val%2)==0)
@@ -438,23 +467,26 @@ static int compute_magic_bits(int *index)
/* Convert a sequence of (hopefully) small positive integers
using the base pointed to by index (x base, y base and z base can be different).
The largest number of integers supported is 18 (29 to handle/detect overflow) */
-static void trajcoder_base_compress(int *input, int n, int *index, unsigned char *result)
+static void trajcoder_base_compress(int *input, const int n, int *index, unsigned char *result)
{
unsigned int largeint[19];
unsigned int largeint_tmp[19];
- int i,j;
- for (i=0; i<19; i++)
- largeint[i]=0U;
+ int i, j;
+
+ memset(largeint, 0U, sizeof(unsigned int) * 19);
- for (i=0; i<n; i++)
+ if(n > 0)
{
- if (i!=0)
- {
- /* We must do the multiplication of the largeint with the integer base */
- Ptngc_largeint_mul(magic[index[i%3]],largeint,largeint_tmp,19);
- for (j=0; j<19; j++)
- largeint[j]=largeint_tmp[j];
- }
+ Ptngc_largeint_add(input[0],largeint,19);
+ }
+
+ for (i=1; i<n; i++)
+ {
+ /* We must do the multiplication of the largeint with the integer base */
+ Ptngc_largeint_mul(magic[index[i%3]],largeint,largeint_tmp,19);
+
+ memcpy(largeint,largeint_tmp,19*sizeof *largeint);
+
Ptngc_largeint_add(input[i],largeint,19);
}
if (largeint[18])
@@ -481,7 +513,7 @@ static void trajcoder_base_compress(int *input, int n, int *index, unsigned char
}
/* The opposite of base_compress. */
-static void trajcoder_base_decompress(unsigned char *input, int n, int *index, int *output)
+static void trajcoder_base_decompress(unsigned char *input, const int n, int *index, int *output)
{
unsigned int largeint[19];
unsigned int largeint_tmp[19];
@@ -524,7 +556,7 @@ static void trajcoder_base_decompress(unsigned char *input, int n, int *index, i
/* It is "large" if we have to increase the small index quite a
bit. Not so much to be rejected by the not very large check
later. */
-static int is_quite_large(int *input, int small_index, int max_large_index)
+static int is_quite_large(int *input, const int small_index, const int max_large_index)
{
int is=0;
int i;
@@ -547,7 +579,7 @@ int nbits_sum;
int nvalues_sum;
#endif
-static void write_three_large(struct coder *coder, int *encode_ints, int *large_index, int nbits, unsigned char *compress_buffer, unsigned char **output_ptr)
+static void write_three_large(struct coder *coder, int *encode_ints, int *large_index, const int nbits, unsigned char *compress_buffer, unsigned char **output_ptr)
{
trajcoder_base_compress(encode_ints,3,large_index,compress_buffer);
Ptngc_writemanybits(coder,compress_buffer,nbits,output_ptr);
@@ -559,7 +591,7 @@ static void write_three_large(struct coder *coder, int *encode_ints, int *large_
#endif
}
-static void insert_batch(int *input_ptr, int ntriplets_left, int *prevcoord,int *minint, int *encode_ints, int startenc, int *nenc)
+static void insert_batch(int *input_ptr, int ntriplets_left, const int *prevcoord,int *minint, int *encode_ints, const int startenc, int *nenc)
{
int nencode=startenc*3;
int tmp_prevcoord[3];
@@ -617,8 +649,8 @@ static void insert_batch(int *input_ptr, int ntriplets_left, int *prevcoord,int
*nenc=nencode;
}
-static void flush_large(struct coder *coder, int *has_large, int *has_large_ints, int n,
- int *large_index, int large_nbits, unsigned char *compress_buffer,
+static void flush_large(struct coder *coder, int *has_large, int *has_large_ints, const int n,
+ int *large_index, const int large_nbits, unsigned char *compress_buffer,
unsigned char **output_ptr)
{
int i;
@@ -651,7 +683,7 @@ static void flush_large(struct coder *coder, int *has_large, int *has_large_ints
}
static void buffer_large(struct coder *coder, int *has_large, int *has_large_ints, int *new_large_ints,
- int *large_index, int large_nbits, unsigned char *compress_buffer,
+ int *large_index, const int large_nbits, unsigned char *compress_buffer,
unsigned char **output_ptr)
{
/* If it is full we must write them all. */
@@ -669,7 +701,7 @@ unsigned char *Ptngc_pack_array_xtc2(struct coder *coder,int *input, int *length
{
unsigned char *output=NULL;
unsigned char *output_ptr=NULL;
- int i,ienc,j;
+ int i,ienc,j,imult;
int output_length=0;
/* Pack triplets. */
int ntriplets=*length/3;
@@ -709,13 +741,15 @@ unsigned char *Ptngc_pack_array_xtc2(struct coder *coder,int *input, int *length
maxint[2]=minint[2]=input[2];
for (i=1; i<ntriplets; i++)
- for (j=0; j<3; j++)
- {
- if (input[i*3+j]>maxint[j])
- maxint[j]=input[i*3+j];
- if (input[i*3+j]<minint[j])
- minint[j]=input[i*3+j];
- }
+ {
+ for (j=0; j<3; j++)
+ {
+ if (input[i*3+j]>maxint[j])
+ maxint[j]=input[i*3+j];
+ if (input[i*3+j]<minint[j])
+ minint[j]=input[i*3+j];
+ }
+ }
large_index[0]=Ptngc_find_magic_index(maxint[0]-minint[0]+1);
large_index[1]=Ptngc_find_magic_index(maxint[1]-minint[1]+1);
@@ -794,9 +828,7 @@ unsigned char *Ptngc_pack_array_xtc2(struct coder *coder,int *input, int *length
#endif
/* Initial prevcoord is the minimum integers. */
- prevcoord[0]=minint[0];
- prevcoord[1]=minint[1];
- prevcoord[2]=minint[2];
+ memcpy(prevcoord, minint, 3*sizeof *prevcoord);
while (ntriplets_left)
{
@@ -1304,9 +1336,7 @@ int Ptngc_unpack_array_xtc2(struct coder *coder,unsigned char *packed,int *outpu
#endif
/* Initial prevcoord is the minimum integers. */
- prevcoord[0]=minint[0];
- prevcoord[1]=minint[1];
- prevcoord[2]=minint[2];
+ memcpy(prevcoord, minint, 3*sizeof *prevcoord);
while (ntriplets_left)
{
@@ -1329,9 +1359,7 @@ int Ptngc_unpack_array_xtc2(struct coder *coder,unsigned char *packed,int *outpu
/* Get the large value. */
readmanybits(&ptr,&bitptr,large_nbits,compress_buffer);
trajcoder_base_decompress(compress_buffer,3,large_index,encode_ints);
- large_ints[0]=encode_ints[0];
- large_ints[1]=encode_ints[1];
- large_ints[2]=encode_ints[2];
+ memcpy(large_ints, encode_ints, 3*sizeof *large_ints);
#ifdef SHOWIT
fprintf(stderr,"large ints: %d %d %d\n",large_ints[0],large_ints[1],large_ints[2]);
#endif
@@ -1444,16 +1472,12 @@ int Ptngc_unpack_array_xtc2(struct coder *coder,unsigned char *packed,int *outpu
/* Get the large value. */
readmanybits(&ptr,&bitptr,large_nbits,compress_buffer);
trajcoder_base_decompress(compress_buffer,3,large_index,encode_ints);
- large_ints[0]=encode_ints[0];
- large_ints[1]=encode_ints[1];
- large_ints[2]=encode_ints[2];
+ memcpy(large_ints, encode_ints, 3*sizeof *large_ints);
/* Output large value */
*output++=large_ints[0]+minint[0];
*output++=large_ints[1]+minint[1];
*output++=large_ints[2]+minint[2];
- prevcoord[0]=large_ints[0];
- prevcoord[1]=large_ints[1];
- prevcoord[2]=large_ints[2];
+ memcpy(prevcoord, large_ints, 3*sizeof *prevcoord);
}
ntriplets_left-=n;
}
contact: Jan Huwald // Impressum