Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <chrono>
- #include <vector>
- #include <iomanip>
- #include <windows.h>
- #include <string>
- #include <sstream>
- #include <new>
- #include <map>
- #include <string>
- #include <string_view>
- #include <fstream>
- #include <algorithm>
- constexpr size_t N = 48;
- constexpr size_t CYCLES = 10000;
- constexpr size_t K = 2;
- constexpr size_t L3 = 3 * 1024 * 1024;
- constexpr size_t L2 = 256 * 1024;
- constexpr size_t L1 = 32 * 1024;
- __declspec(align(64)) struct u64_8
- {
- uint64_t u0;
- uint64_t u1;
- uint64_t u2;
- uint64_t u3;
- uint64_t u4;
- uint64_t u5;
- uint64_t u6;
- uint64_t u7;
- };
- using duration_t = std::chrono::high_resolution_clock::duration;
- using measure_map_t = std::map<std::string,std::vector<duration_t>>;
- std::vector<duration_t> test_cache(const size_t size)
- {
- std::vector<duration_t> results;
- results.reserve(N - 2);
- const size_t offset = (size * K) / sizeof(u64_8);
- u64_8* const mas = (u64_8*)_aligned_malloc(sizeof(u64_8) * offset * N, 64);
- for (size_t n = 2; n <= N; ++n)
- {
- const size_t block_size = (size / sizeof(u64_8)) / n / 2;
- for (size_t i = 0; i < n; ++i)
- {
- for (size_t j = 0; j < block_size; ++j)
- {
- if (i == n - 1)
- {
- if (j == block_size - 1)
- mas[i * offset + j].u0 = 0;
- else
- mas[i * offset + j].u0 = j + 1;
- }
- else
- {
- mas[i * offset + j].u0 = (i + 1) * offset + j;
- }
- }
- }
- uint64_t t = 0;
- std::chrono::time_point<std::chrono::high_resolution_clock> start, end;
- start = std::chrono::high_resolution_clock::now();
- for (int i = 0; i < size / sizeof(u64_8) / n / 2 * n * CYCLES; ++i)
- {
- t = mas[t].u0;
- }
- end = std::chrono::high_resolution_clock::now();
- printf("%d", t);
- results.push_back(end - start);
- }
- _aligned_free(mas);
- return results;
- }
- void debug_print_measure(const std::string_view name,const std::vector<duration_t>& measures)
- {
- std::cout << name << std::endl;
- const size_t numMeasures = measures.size();
- for (int iMeasure = 0; iMeasure < numMeasures; ++iMeasure)
- {
- std::cout << "N: " << std::setw(2) << iMeasure + 2 << " Time: " << std::setw(16) << measures[iMeasure].count() << " ns" << std::endl;
- }
- }
- void debug_print_measures(const measure_map_t& measureResults)
- {
- for(const auto&[name, measures] : measureResults)
- {
- debug_print_measure(name,measures);
- }
- }
- void to_csv(const std::string_view path, const measure_map_t& measureResults)
- {
- for(const auto&[name, measures] : measureResults)
- {
- std::ofstream file;
- file.open(path.data()+name+".txt");
- file <<"\""<<"N"<<"\""<<","<<"\""<<"Time"<<"\""<<std::endl;
- const size_t numMeasures = measures.size();
- for (int iMeasure = 0; iMeasure < numMeasures; ++iMeasure)
- {
- file<<iMeasure + 2 << "," << measures[iMeasure].count() <<std::endl;
- }
- }
- }
- constexpr size_t veryNiceName = 50;
- const std::string L3NAME = "L3";
- const std::string L2NAME = "L2";
- const std::string L1NAME = "L1";
- measure_map_t avaragize(const std::vector<measure_map_t>& vec_measures)
- {
- measure_map_t ret;
- const size_t ssssize = vec_measures[0].at(L3NAME).size();
- std::vector<duration_t> vec3(ssssize);
- std::vector<duration_t> vec2(ssssize);
- std::vector<duration_t> vec1(ssssize);
- std::fill(vec3.begin(), vec3.end(), duration_t(0));
- std::fill(vec2.begin(), vec2.end(), duration_t(0));
- std::fill(vec1.begin(), vec1.end(), duration_t(0));
- for (const auto eachMap : vec_measures)
- {
- auto vec3each = eachMap.at(L3NAME);
- auto vec2each = eachMap.at(L2NAME);
- auto vec1each = eachMap.at(L1NAME);
- std::transform (vec1.begin(), vec1.end(), vec1each.begin(), vec1.begin(), [](auto from1, auto from2){return from1+from2/veryNiceName;});
- std::transform (vec2.begin(), vec2.end(), vec2each.begin(), vec2.begin(), [](auto from1, auto from2){return from1+from2/veryNiceName;});
- std::transform (vec3.begin(), vec3.end(), vec3each.begin(), vec3.begin(), [](auto from1, auto from2){return from1+from2/veryNiceName;});
- }
- ret.insert(std::make_pair(L1NAME,std::move(vec1)));
- ret.insert(std::make_pair(L2NAME,std::move(vec2)));
- ret.insert(std::make_pair(L3NAME,std::move(vec3)));
- return ret;
- }
- int main()
- {
- SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
- std::vector<measure_map_t> idkHowToNameThis;
- idkHowToNameThis.resize(veryNiceName );
- for (int i = 0 ; i < veryNiceName ; i++)
- {
- measure_map_t measureResults;
- measureResults.insert(std::make_pair(L3NAME,test_cache(L3)));
- measureResults.insert(std::make_pair(L2NAME,test_cache(L2)));
- measureResults.insert(std::make_pair(L1NAME,test_cache(L1)));
- idkHowToNameThis[i]=std::move(measureResults);
- }
- measure_map_t asd = avaragize(idkHowToNameThis);
- debug_print_measures(asd);
- to_csv("c://users//alex//desktop//myfile",asd);
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement