Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdint.h>
- #include <time.h>
- #include <mutex>
- #include <thread>
- #include <atomic>
- #include <random>
- uint32_t BUCKETS = 1024;
- uint32_t MC_SAMPLES = 262144 * 32;
- uint32_t THREADS = std::thread::hardware_concurrency();
- uint32_t ITERATIONS = 255;
- uint32_t ITERATION = 0;
- std::atomic<uint32_t>** array;
- uint32_t random(uint64_t* seed)
- {
- return (*seed += *seed * *seed | 5) >> 32;
- }
- uint32_t get_bucket_from_key(uint32_t key)
- {
- return key % BUCKETS;
- }
- void thread_func()
- {
- uint64_t seed;
- // Get merseene twister random here
- std::random_device dev;
- std::mt19937 rng(dev());
- seed = rng();
- for (uint32_t i = 0; i < MC_SAMPLES; i++)
- {
- uint32_t index;
- uint32_t value;
- value = random(&seed);
- array[ITERATION][get_bucket_from_key(value)]++;
- }
- }
- int main()
- {
- array = new std::atomic<uint32_t>*[ITERATIONS];
- for (uint32_t i = 0; i < ITERATIONS; i++)
- {
- array[i] = new std::atomic<uint32_t>[BUCKETS];
- for (uint32_t j = 0; j < BUCKETS; j++)
- {
- array[i][j] = 0;
- }
- }
- for (size_t iter = 0; iter < ITERATIONS; iter++)
- {
- ITERATION = iter;
- // Launch threads to fill array
- std::thread* threads = new std::thread[THREADS];
- for (uint32_t i = 0; i < THREADS; i++)
- {
- threads[i] = std::thread(thread_func);
- }
- for (uint32_t i = 0; i < THREADS; i++)
- {
- threads[i].join();
- }
- // Normalize number in array to 0 - 255
- uint32_t max = 0;
- for (uint32_t i = 0; i < BUCKETS; i++)
- {
- if (array[iter][i] > max)
- {
- max = array[iter][i];
- }
- }
- for (uint32_t i = 0; i < BUCKETS; i++)
- {
- array[iter][i] = (array[iter][i] * 255) / max;
- }
- printf("Iteration %d/%d done\n", iter + 1, ITERATIONS);
- }
- // Write ppm file to visualize the result
- FILE* f;
- fopen_s(&f, "result.ppm", "wb");
- fprintf(f, "P6\n%d %d\n255\n", BUCKETS, 256);
- for (uint32_t y = 0; y < 256; y++)
- {
- for (uint32_t x = 0; x < BUCKETS; x++)
- {
- uint8_t color = 0;
- for (uint32_t i = 0; i < ITERATIONS; i++)
- {
- if (array[i][x] <= (255 - y))
- {
- color++;
- }
- }
- fwrite(&color, 1, 1, f);
- fwrite(&color, 1, 1, f);
- fwrite(&color, 1, 1, f);
- }
- }
- fclose(f);
- }
Advertisement
Add Comment
Please, Sign In to add comment