tweak: fix parallelism in squiggle.c
This commit is contained in:
		
							parent
							
								
									06e78cb079
								
							
						
					
					
						commit
						825336ef0a
					
				
										
											Binary file not shown.
										
									
								
							|  | @ -306,10 +306,25 @@ ci convert_lognormal_params_to_ci(lognormal_params y) | ||||||
| 
 | 
 | ||||||
| /* Parallel sampler */ | /* Parallel sampler */ | ||||||
| void parallel_sampler(double (*sampler)(uint64_t* seed), double* results, int n_threads, int n_samples){ | void parallel_sampler(double (*sampler)(uint64_t* seed), double* results, int n_threads, int n_samples){ | ||||||
|     if((n_samples % n_threads) != 0){ |      | ||||||
|         fprintf(stderr, "Number of samples isn't divisible by number of threads, aborting\n"); |     // Division terminology:
 | ||||||
|         exit(1); |     // a =  b * quotient + reminder
 | ||||||
|     } |     // a = (a/b)*b + (a%b)
 | ||||||
|  |     // dividend: a
 | ||||||
|  |     // divisor: b
 | ||||||
|  |     // quotient = a / b
 | ||||||
|  |     // reminder = a % b
 | ||||||
|  |     // "divisor's multiple" := (a/b)*b
 | ||||||
|  | 
 | ||||||
|  |     // now, we have n_samples and n_threads
 | ||||||
|  |     // to make our life easy, each thread will have a number of samples of: a/b (quotient)
 | ||||||
|  |     // and we'll compute the remainder of samples separately
 | ||||||
|  |     // to possibly do by Jorge: improve so that the remainder is included in the threads
 | ||||||
|  | 
 | ||||||
|  |     int quotient = n_samples / n_threads; | ||||||
|  |     int remainder = n_samples % n_threads; | ||||||
|  |     int divisor_multiple = quotient * n_threads;  | ||||||
|  | 
 | ||||||
|     uint64_t** seeds = malloc(n_threads * sizeof(uint64_t*)); |     uint64_t** seeds = malloc(n_threads * sizeof(uint64_t*)); | ||||||
|     for (uint64_t i = 0; i < n_threads; i++) { |     for (uint64_t i = 0; i < n_threads; i++) { | ||||||
|         seeds[i] = malloc(sizeof(uint64_t)); |         seeds[i] = malloc(sizeof(uint64_t)); | ||||||
|  | @ -321,14 +336,18 @@ void parallel_sampler(double (*sampler)(uint64_t* seed), double* results, int n_ | ||||||
|     { |     { | ||||||
|         #pragma omp for |         #pragma omp for | ||||||
|         for (i = 0; i < n_threads; i++) { |         for (i = 0; i < n_threads; i++) { | ||||||
|             int lower_bound = i * (n_samples / n_threads); |             int lower_bound_inclusive = i * quotient; | ||||||
|             int upper_bound = ((i+1) * (n_samples / n_threads)) - 1; |             int upper_bound_not_inclusive = ((i+1) * quotient); // note the < in the for loop below, 
 | ||||||
|             // printf("Lower bound: %d, upper bound: %d\n", lower_bound, upper_bound);
 |             // printf("Lower bound: %d, upper bound: %d\n", lower_bound, upper_bound);
 | ||||||
|             for (int j = lower_bound; j < upper_bound; j++) { |             for (int j = lower_bound_inclusive; j < upper_bound_not_inclusive; j++) { | ||||||
|                 results[j] = sampler(seeds[i]); |                 results[j] = sampler(seeds[i]); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |     for(int j=divisor_multiple; j<n_samples; j++){ | ||||||
|  |         results[j] = sampler(seeds[0]); | ||||||
|  |         // we can just reuse a seed, this isn't problematic because we are not doing multithreading
 | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     for (uint64_t i = 0; i < n_threads; i++) { |     for (uint64_t i = 0; i < n_threads; i++) { | ||||||
|         free(seeds[i]); |         free(seeds[i]); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user