[Genabel-commits] r1898 - in pkg/OmicABEL: . src
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Sun Dec 21 15:15:00 CET 2014
Author: dfabregat
Date: 2014-12-21 15:14:59 +0100 (Sun, 21 Dec 2014)
New Revision: 1898
Modified:
pkg/OmicABEL/make.inc
pkg/OmicABEL/src/GWAS.c
pkg/OmicABEL/src/databel.c
pkg/OmicABEL/src/double_buffering.c
pkg/OmicABEL/src/fgls_chol.c
pkg/OmicABEL/src/fgls_eigen.c
pkg/OmicABEL/src/ooc_BLAS.c
pkg/OmicABEL/src/utils.c
Log:
Fixed a bug (and other potential sources of bugs) due to overflows of integers when not using castings to size_t.
Thanks to Maksim Struchalin for pointing it out.
Modified: pkg/OmicABEL/make.inc
===================================================================
--- pkg/OmicABEL/make.inc 2014-12-05 11:30:19 UTC (rev 1897)
+++ pkg/OmicABEL/make.inc 2014-12-21 14:14:59 UTC (rev 1898)
@@ -2,4 +2,4 @@
CFLAGS = -D_FILE_OFFSET_BITS=64 -pthread -fopenmp -DGOTO -DLINUX
LDFLAGS =
-LDLIBS = -llapack -lblas -lgfortran -gfortranbegin -lpthread -lrt
+LDLIBS = /home/dfabregat/libs/lapack/lapack_LINUX.a /home/dfabregat/libs/GotoBLAS2/libgoto2.a -lgfortran -gfortranbegin -lpthread -lrt
Modified: pkg/OmicABEL/src/GWAS.c
===================================================================
--- pkg/OmicABEL/src/GWAS.c 2014-12-05 11:30:19 UTC (rev 1897)
+++ pkg/OmicABEL/src/GWAS.c 2014-12-21 14:14:59 UTC (rev 1898)
@@ -118,7 +118,7 @@
// Sanity check (Phi)
checkNoNans(cf->n * cf->n, cf->Phi, "[ERROR] NaNs not allowed in Phi\n");
cf->XL = (double *) fgls_malloc ( cf->n * cf->wXL * sizeof(double) );
- load_file ( cf->XL_data_path, "rb", cf->XL, cf->n * cf->wXL );
+ load_file ( cf->XL_data_path, "rb", cf->XL, cf->n * cf->wXL );
// Sanity check (XL)
average( cf->XL, cf->n, cf->wXL, cf->threshold, "Covariate",
&cf->XL_fvi->fvi_data[cf->n*NAMELENGTH], NAMELENGTH, 1, cf->num_threads );
Modified: pkg/OmicABEL/src/databel.c
===================================================================
--- pkg/OmicABEL/src/databel.c 2014-12-05 11:30:19 UTC (rev 1897)
+++ pkg/OmicABEL/src/databel.c 2014-12-21 14:14:59 UTC (rev 1898)
@@ -39,7 +39,7 @@
// Header
fread( &fvi->fvi_header, sizeof(databel_fvi_header), 1, f );
// Labels
- data_size = (fvi->fvi_header.numVariables +fvi->fvi_header.numObservations ) *
+ data_size = ((size_t)fvi->fvi_header.numVariables + fvi->fvi_header.numObservations ) *
fvi->fvi_header.namelength * sizeof(char);
fvi->fvi_data = (char *) fgls_malloc ( data_size );
// Load labels
Modified: pkg/OmicABEL/src/double_buffering.c
===================================================================
--- pkg/OmicABEL/src/double_buffering.c 2014-12-05 11:30:19 UTC (rev 1897)
+++ pkg/OmicABEL/src/double_buffering.c 2014-12-21 14:14:59 UTC (rev 1898)
@@ -161,7 +161,7 @@
// Which buffer
/*aiocb_list *buff = wh_buff == IO_BUFF ? b->io_l : b->comp_l;*/
// Still buff_size available?
- size_t nbytes = (to - from + 1) * cf->n * sizeof(double);
+ size_t nbytes = (size_t)(to - from + 1) * cf->n * sizeof(double);
// Number of chunks to read
/*int chunks_to_read = size_t_ceil( nbytes, (size_t)MAX_AIO_SIZE );*/
// offset
@@ -181,7 +181,7 @@
// Which buffer
/*aiocb_list *buff = wh_buff == IO_BUFF ? b->io_l : b->comp_l;*/
// Still buff_size available?
- size_t nbytes = (to - from + 1) * cf->n * cf->wXR * sizeof(double);
+ size_t nbytes = (size_t)(to - from + 1) * cf->n * cf->wXR * sizeof(double);
// Number of chunks to read
/*int chunks_to_read = size_t_ceil( nbytes, (size_t)MAX_AIO_SIZE );*/
// offset
@@ -203,7 +203,7 @@
// Which buffer
/*aiocb_list *buff = wh_buff == IO_BUFF ? b->io_l : b->comp_l;*/
// Still buff_size available?
- size_t nbytes = (to_i - from_i + 1) * size_one_b *
+ size_t nbytes = (size_t)(to_i - from_i + 1) * size_one_b *
(to_j - from_j + 1) * sizeof(double);
// Number of chunks to write
/*int chunks_to_write = size_t_ceil( nbytes, (size_t)MAX_AIO_SIZE );*/
@@ -225,7 +225,7 @@
// Which buffer
/*aiocb_list *buff = wh_buff == IO_BUFF ? b->io_l : b->comp_l;*/
// Still buff_size available?
- size_t nbytes = ((to_i - from_i + 1) * cf->p * cf->p *
+ size_t nbytes = (size_t)((to_i - from_i + 1) * cf->p * cf->p *
(to_j - from_j + 1)) * sizeof(double);
// Number of chunks to write
/*int chunks_to_write = size_t_ceil( nbytes, (size_t)MAX_AIO_SIZE );*/
Modified: pkg/OmicABEL/src/fgls_chol.c
===================================================================
--- pkg/OmicABEL/src/fgls_chol.c 2014-12-05 11:30:19 UTC (rev 1897)
+++ pkg/OmicABEL/src/fgls_chol.c 2014-12-21 14:14:59 UTC (rev 1898)
@@ -188,7 +188,7 @@
beta = res_sigma[j] * (1 - h2[j]);
dscal_(&nn, &alpha, M, &iONE);
for ( i = 0; i < n; i++ )
- M[i*n + i] = M[i*n + i] + beta;
+ M[i*n + i] = M[i*n + i] + beta; // size_t?
/* L * L' = M */
dpotrf_(LOWER, &n, M, &n, &info);
@@ -234,7 +234,7 @@
VT_USER_START("READ_X");
#endif
/* Read next block of XR's */
- size_t next_x_from = ((size_t)ib + x_b) >= m ? 0 : (size_t)ib + x_b;
+ size_t next_x_from = ((size_t)ib + x_b) >= m ? 0 : (size_t)ib + (size_t)x_b;
size_t next_x_to = ((size_t)ib + x_b) >= m ? MIN( (size_t)x_b, (size_t)m ) - 1 :
next_x_from + MIN( (size_t)x_b, (size_t)m - next_x_from ) - 1;
double_buffering_read_XR( &db_XR, IO_BUFF, next_x_from, next_x_to );
@@ -424,7 +424,7 @@
*tmp;
int i, j;
- tmp = fgls_malloc( n * n * sizeof(double) );
+ tmp = fgls_malloc( (size_t)n * n * sizeof(double) );
// tmp = Z * W
for ( j = 0; j < n; j++ )
Modified: pkg/OmicABEL/src/fgls_eigen.c
===================================================================
--- pkg/OmicABEL/src/fgls_eigen.c 2014-12-05 11:30:19 UTC (rev 1897)
+++ pkg/OmicABEL/src/fgls_eigen.c 2014-12-21 14:14:59 UTC (rev 1898)
@@ -102,7 +102,6 @@
void ooc_loops( eigen_loops_t *loops_t )
{
- /*eigen_loops_t *loops_t = ( eigen_loops_t* ) in;*/
FGLS_config_t *cf = loops_t->cf;
/* Dimensions of the problem */
@@ -292,7 +291,7 @@
for ( l = 0; l < n; l++ )
XR_copy[ l ] = XR_comp[ i * n + l ] * Winv[j*n + l];
- Bij = &B_comp[ j*size_one_b_record*x_inc + i*size_one_b_record];
+ Bij = &B_comp[ j*size_one_b_record*x_inc + i*size_one_b_record];
/* Building B */
// Copy B_T
@@ -442,11 +441,11 @@
loops->oneB = ( double * ) fgls_malloc ( cf->p * cf->num_threads * sizeof(double) );
loops->oneV = ( double * ) fgls_malloc ( cf->p * cf->p * cf->num_threads * sizeof(double) );
- double_buffering_init( &loops->db_XR, (size_t)cf->n * cf->wXR * cf->x_b * sizeof(double),
+ double_buffering_init( &loops->db_XR, cf->n * cf->wXR * cf->x_b * sizeof(double),
cf->ZtXR, cf ); // _fp
- double_buffering_init( &loops->db_Y, (size_t)cf->n * cf->y_b * sizeof(double),
+ double_buffering_init( &loops->db_Y, cf->n * cf->y_b * sizeof(double),
cf->ZtY, cf );
- double_buffering_init( &loops->db_B, (size_t)size_one_b_record * cf->x_b * cf->y_b * sizeof(double),
+ double_buffering_init( &loops->db_B, size_one_b_record * cf->x_b * cf->y_b * sizeof(double),
cf->B, cf );
loops->cf = cf;
Modified: pkg/OmicABEL/src/ooc_BLAS.c
===================================================================
--- pkg/OmicABEL/src/ooc_BLAS.c 2014-12-05 11:30:19 UTC (rev 1897)
+++ pkg/OmicABEL/src/ooc_BLAS.c 2014-12-21 14:14:59 UTC (rev 1898)
@@ -67,9 +67,9 @@
/* Asynchronous IO data structures */
double *in_comp, *out_comp;
double_buffering db_in, db_out; // B, C
- double_buffering_init( &db_in, ooc_b * m * sizeof(double),
+ double_buffering_init( &db_in, (size_t)ooc_b * m * sizeof(double),
fp_in, NULL ); // _fp, cf not needed in this case
- double_buffering_init( &db_out, ooc_b * m * sizeof(double),
+ double_buffering_init( &db_out, (size_t)ooc_b * m * sizeof(double),
fp_out, NULL ); // _fp, cf not needed in this case
/* BLAS constants */
@@ -86,7 +86,7 @@
for ( i = 0; i < n; i += ooc_b )
{
/* Read next piece of "in" */
- size_t nbytes = i + ooc_b > n ? 1 : MIN( ooc_b * m, ( n - (size_t)( i + ooc_b ) ) * m ) * sizeof(double);
+ size_t nbytes = i + ooc_b > n ? 1 : MIN( (size_t)ooc_b * m, ( n - (size_t)( i + ooc_b ) ) * m ) * sizeof(double);
off_t offset = i + ooc_b > n ? 0 : (off_t)(i + ooc_b) * m * sizeof(double);
double_buffering_read( &db_in, IO_BUFF, nbytes, offset );
@@ -123,7 +123,7 @@
/* Write current piece of "out" */
double_buffering_write( &db_out, COMP_BUFF,
- MIN( ooc_b * m, (size_t)(n - i) * m ) * sizeof(double),
+ MIN( (size_t)ooc_b * m, (size_t)(n - i) * m ) * sizeof(double),
(off_t)i * m * sizeof(double) );
/* Swap buffers */
Modified: pkg/OmicABEL/src/utils.c
===================================================================
--- pkg/OmicABEL/src/utils.c 2014-12-05 11:30:19 UTC (rev 1897)
+++ pkg/OmicABEL/src/utils.c 2014-12-21 14:14:59 UTC (rev 1898)
@@ -328,6 +328,7 @@
double sum, avg;
int nans, infs;
+ // size_t n and n_cols?
#pragma omp parallel for private(j, sum, nans, infs, i, avg) schedule(static, 4) num_threads(nths)
for ( j = 0; j < ncols; j++ )
{
More information about the Genabel-commits
mailing list