star-mc

Parallel estimation of Monte Carlo integrators
git clone git://git.meso-star.fr/star-mc.git
Log | Files | Refs | README | LICENSE

commit e6dc2310774d9d0d155b3c080a4ecdc028a836e1
parent 295f2c1269253874260ddf48d89eee26df7e2960
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 20 Oct 2021 11:42:38 +0200

Merge branch 'release_0.5'

Diffstat:
MREADME.md | 6++++++
Mcmake/CMakeLists.txt | 6+++---
Msrc/smc.h | 8++++----
Msrc/smc_device.c | 11++++++-----
Msrc/smc_estimator.c | 2+-
Msrc/test_smc_device.c | 42++++++++++++++++++++++++------------------
Msrc/test_smc_doubleN.c | 3++-
Msrc/test_smc_errors.c | 3++-
Msrc/test_smc_light_path.c | 14+++++++-------
Msrc/test_smc_solve.c | 3++-
10 files changed, 57 insertions(+), 41 deletions(-)

diff --git a/README.md b/README.md @@ -22,6 +22,12 @@ project. ## Release notes +### Version 0.5 + +Sets the required version of Star-SampPling to 0.12.1. The versions 0.12 and +highers fix compilation errors with gcc 11 but introduces API breaks: the +`ssp_rng_type` is no longer a structure but becomes an enumeration. + ### Version 0.4.1 - Add a progress log during computations. diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt @@ -41,7 +41,7 @@ option(NO_TEST "Disable the test" OFF) ################################################################################ find_package(RCMake 0.3 REQUIRED) find_package(RSys 0.6 REQUIRED) -find_package(StarSP 0.5 REQUIRED) +find_package(StarSP 0.12.1 REQUIRED) find_package(OpenMP 1.2 REQUIRED) find_package(Star3D 0.4) @@ -59,8 +59,8 @@ include(rcmake_runtime) # Configure and define targets ################################################################################ set(VERSION_MAJOR 0) -set(VERSION_MINOR 4) -set(VERSION_PATCH 1) +set(VERSION_MINOR 5) +set(VERSION_PATCH 0) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) set(SMC_FILES_SRC diff --git a/src/smc.h b/src/smc.h @@ -32,6 +32,7 @@ #ifndef SMC_H #define SMC_H +#include <star/ssp.h> #include <rsys/rsys.h> #include <limits.h> @@ -59,7 +60,6 @@ struct logger; struct mem_allocator; struct ssp_rng; -struct ssp_rng_type; /* Generic type descriptor */ struct smc_type { @@ -129,7 +129,7 @@ smc_device_create (struct logger* logger, /* May be NULL <=> use default logger */ struct mem_allocator* allocator, /* May be NULL <=> use default allocator */ const unsigned nthreads_hint, /* Hint on the number of threads to use */ - const struct ssp_rng_type* type, /* May be NULL <=> use default RNG type */ + const enum ssp_rng_type type, /* SSP_RNG_TYPE_NULL <=> use default RNG type */ struct smc_device** dev); SMC_API res_T @@ -143,12 +143,12 @@ smc_device_ref_put SMC_API res_T smc_device_set_rng_type (struct smc_device* dev, - const struct ssp_rng_type* type); + const enum ssp_rng_type type); SMC_API res_T smc_device_get_rng_type (struct smc_device* dev, - struct ssp_rng_type* type); + enum ssp_rng_type* type); /* Return the maximum number of threads internally used by the device */ SMC_API res_T diff --git a/src/smc_device.c b/src/smc_device.c @@ -82,7 +82,7 @@ smc_device_create (struct logger* logger, struct mem_allocator* mem_allocator, const unsigned nthreads_hint, - const struct ssp_rng_type* rng_type, + const enum ssp_rng_type rng_type, struct smc_device** out_dev) { struct smc_device* dev = NULL; @@ -106,7 +106,8 @@ smc_device_create dev->nthreads = MMIN(nthreads_hint, (unsigned)omp_get_num_procs()); omp_set_num_threads((int)dev->nthreads); - res = smc_device_set_rng_type(dev, rng_type ? rng_type : &ssp_rng_threefry); + res = smc_device_set_rng_type + (dev, rng_type == SSP_RNG_TYPE_NULL ? SSP_RNG_THREEFRY : rng_type); if(res != RES_OK) goto error; @@ -138,14 +139,14 @@ smc_device_ref_put(struct smc_device* dev) } res_T -smc_device_set_rng_type(struct smc_device* dev, const struct ssp_rng_type* type) +smc_device_set_rng_type(struct smc_device* dev, const enum ssp_rng_type type) { size_t i; res_T res = RES_OK; struct ssp_rng_proxy* proxy = NULL; struct ssp_rng** rngs = NULL; - if(!dev || !type) { + if(!dev || type == SSP_RNG_TYPE_NULL) { /* Skip the error block */ return RES_BAD_ARG; } @@ -188,7 +189,7 @@ error: } res_T -smc_device_get_rng_type(struct smc_device* dev, struct ssp_rng_type* type) +smc_device_get_rng_type(struct smc_device* dev, enum ssp_rng_type* type) { if(!dev || !type) return RES_BAD_ARG; return ssp_rng_proxy_get_type(dev->rng_proxy, type); diff --git a/src/smc_estimator.c b/src/smc_estimator.c @@ -218,7 +218,7 @@ smc_solve #pragma omp critical { nfailed += 1; - if(nfailed >= integrator->max_failures) { + if(nfailed > integrator->max_failures) { ATOMIC_SET(&cancel, 1); } } diff --git a/src/test_smc_device.c b/src/test_smc_device.c @@ -48,13 +48,15 @@ main(int argc, char** argv) { struct logger logger; struct mem_allocator allocator; - struct ssp_rng_type type; + enum ssp_rng_type type; struct smc_device* dev; unsigned nthreads; (void)argc, (void)argv; - CHK(smc_device_create(NULL, NULL, SMC_NTHREADS_DEFAULT, NULL, NULL) == RES_BAD_ARG); - CHK(smc_device_create(NULL, NULL, SMC_NTHREADS_DEFAULT, NULL, &dev) == RES_OK); + CHK(smc_device_create + (NULL, NULL, SMC_NTHREADS_DEFAULT, SSP_RNG_TYPE_NULL, NULL) == RES_BAD_ARG); + CHK(smc_device_create + (NULL, NULL, SMC_NTHREADS_DEFAULT, SSP_RNG_TYPE_NULL, &dev) == RES_OK); CHK(smc_device_get_threads_count(NULL, NULL) == RES_BAD_ARG); CHK(smc_device_get_threads_count(dev, NULL) == RES_BAD_ARG); @@ -68,13 +70,15 @@ main(int argc, char** argv) CHK(smc_device_ref_put(dev) == RES_OK); CHK(smc_device_ref_put(dev) == RES_OK); - CHK(smc_device_create(NULL, NULL, 0, NULL, &dev) == RES_BAD_ARG); + CHK(smc_device_create(NULL, NULL, 0, SSP_RNG_TYPE_NULL, &dev) == RES_BAD_ARG); mem_init_proxy_allocator(&allocator, &mem_default_allocator); CHK(MEM_ALLOCATED_SIZE(&allocator) == 0); - CHK(smc_device_create(NULL, &allocator, 1, NULL, NULL) == RES_BAD_ARG); - CHK(smc_device_create(NULL, &allocator, 1, NULL, &dev) == RES_OK); + CHK(smc_device_create + (NULL, &allocator, 1, SSP_RNG_TYPE_NULL, NULL) == RES_BAD_ARG); + CHK(smc_device_create + (NULL, &allocator, 1, SSP_RNG_TYPE_NULL, &dev) == RES_OK); CHK(smc_device_ref_put(dev) == RES_OK); CHK(MEM_ALLOCATED_SIZE(&allocator) == 0); @@ -83,31 +87,33 @@ main(int argc, char** argv) logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHK(smc_device_create(&logger, NULL, 1, NULL, NULL) == RES_BAD_ARG); - CHK(smc_device_create(&logger, NULL, 1, NULL, &dev) == RES_OK); + CHK(smc_device_create(&logger, NULL, 1, SSP_RNG_TYPE_NULL, NULL) == RES_BAD_ARG); + CHK(smc_device_create(&logger, NULL, 1, SSP_RNG_TYPE_NULL, &dev) == RES_OK); CHK(smc_device_ref_put(dev) == RES_OK); - CHK(smc_device_create(&logger, &allocator, 4, NULL, NULL) == RES_BAD_ARG); - CHK(smc_device_create(&logger, &allocator, 4, NULL, &dev) == RES_OK); + CHK(smc_device_create + (&logger, &allocator, 4, SSP_RNG_TYPE_NULL, NULL) == RES_BAD_ARG); + CHK(smc_device_create + (&logger, &allocator, 4, SSP_RNG_TYPE_NULL, &dev) == RES_OK); - CHK(smc_device_set_rng_type(NULL, NULL) == RES_BAD_ARG); - CHK(smc_device_set_rng_type(dev, NULL) == RES_BAD_ARG); - CHK(smc_device_set_rng_type(NULL, &ssp_rng_ranlux48) == RES_BAD_ARG); - CHK(smc_device_set_rng_type(dev, &ssp_rng_ranlux48) == RES_OK); + CHK(smc_device_set_rng_type(NULL, SSP_RNG_TYPE_NULL) == RES_BAD_ARG); + CHK(smc_device_set_rng_type(dev, SSP_RNG_TYPE_NULL) == RES_BAD_ARG); + CHK(smc_device_set_rng_type(NULL, SSP_RNG_RANLUX48) == RES_BAD_ARG); + CHK(smc_device_set_rng_type(dev, SSP_RNG_RANLUX48) == RES_OK); CHK(smc_device_get_rng_type(NULL, NULL) == RES_BAD_ARG); CHK(smc_device_get_rng_type(dev, NULL) == RES_BAD_ARG); CHK(smc_device_get_rng_type(NULL, &type) == RES_BAD_ARG); CHK(smc_device_get_rng_type(dev, &type) == RES_OK); - CHK(ssp_rng_type_eq(&type, &ssp_rng_ranlux48) == 1); + CHK(type == SSP_RNG_RANLUX48); - CHK(smc_device_set_rng_type(dev, &ssp_rng_kiss) == RES_OK); + CHK(smc_device_set_rng_type(dev, SSP_RNG_KISS) == RES_OK); CHK(smc_device_get_rng_type(dev, &type) == RES_OK); - CHK(ssp_rng_type_eq(&type, &ssp_rng_kiss) == 1); + CHK(type == SSP_RNG_KISS); CHK(smc_device_ref_put(dev) == RES_OK); - CHK(smc_device_create(&logger, &allocator, 4, &ssp_rng_ranlux48, &dev) == RES_OK); + CHK(smc_device_create(&logger, &allocator, 4, SSP_RNG_RANLUX48, &dev) == RES_OK); CHK(smc_device_ref_put(dev) == RES_OK); logger_release(&logger); diff --git a/src/test_smc_doubleN.c b/src/test_smc_doubleN.c @@ -78,7 +78,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHK(smc_device_create(NULL, &allocator, SMC_NTHREADS_DEFAULT, NULL, &dev) == RES_OK); + CHK(smc_device_create + (NULL, &allocator, SMC_NTHREADS_DEFAULT, SSP_RNG_TYPE_NULL, &dev) == RES_OK); integrator.integrand = cos_x; integrator.type = &smc_doubleN; diff --git a/src/test_smc_errors.c b/src/test_smc_errors.c @@ -62,7 +62,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - SMC(device_create(NULL, &allocator, SMC_NTHREADS_DEFAULT, NULL, &dev)); + SMC(device_create + (NULL, &allocator, SMC_NTHREADS_DEFAULT, SSP_RNG_TYPE_NULL, &dev)); integrator.integrand = &compute_1; integrator.type = &smc_double; diff --git a/src/test_smc_light_path.c b/src/test_smc_light_path.c @@ -72,8 +72,8 @@ const unsigned cbox_walls_ids[] = { 2, 3, 7, 7, 6, 2 /* Back */ }; -static const unsigned cbox_walls_ntris = sizeof(cbox_walls_ids)/sizeof(unsigned[3]); -static const unsigned cbox_walls_nverts = sizeof(cbox_walls)/sizeof(float[3]); +static const unsigned cbox_walls_ntris = sizeof(cbox_walls_ids)/(3*sizeof(unsigned)); +static const unsigned cbox_walls_nverts = sizeof(cbox_walls)/(3*sizeof(float)); static struct cbox_desc cbox_walls_desc = { cbox_walls, cbox_walls_ids }; /******************************************************************************* @@ -109,15 +109,15 @@ static const unsigned cbox_block_ids[] = { 0, 1, 5, 5, 4, 0 }; -static const unsigned cbox_block_ntris = sizeof(cbox_block_ids)/sizeof(unsigned[3]); +static const unsigned cbox_block_ntris = sizeof(cbox_block_ids)/(3*sizeof(unsigned)); static const unsigned cbox_short_block_nverts = - sizeof(cbox_short_block)/sizeof(float[3]); + sizeof(cbox_short_block)/(3*sizeof(float)); static struct cbox_desc cbox_short_block_desc = { cbox_short_block, cbox_block_ids }; static const unsigned cbox_tall_block_nverts = - sizeof(cbox_tall_block)/sizeof(float[3]); + sizeof(cbox_tall_block)/(3*sizeof(float)); static struct cbox_desc cbox_tall_block_desc = { cbox_tall_block, cbox_block_ids }; @@ -373,8 +373,8 @@ main(int argc, char** argv) CHK(s3d_scene_view_create(scn, S3D_TRACE, &view) == RES_OK); - CHK(smc_device_create(NULL, &allocator, SMC_NTHREADS_DEFAULT, NULL, &smc) - == RES_OK); + CHK(smc_device_create + (NULL, &allocator, SMC_NTHREADS_DEFAULT, SSP_RNG_TYPE_NULL, &smc) == RES_OK); integrator.integrand = light_path_integrator; integrator.type = &smc_float; diff --git a/src/test_smc_solve.c b/src/test_smc_solve.c @@ -74,7 +74,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHK(smc_device_create(NULL, &allocator, SMC_NTHREADS_DEFAULT, NULL, &dev) == RES_OK); + CHK(smc_device_create + (NULL, &allocator, SMC_NTHREADS_DEFAULT, SSP_RNG_TYPE_NULL, &dev) == RES_OK); integrator.integrand = rcp_x; integrator.type = &smc_double;