際際滷

際際滷Share a Scribd company logo
C++17: 仗舒舒仍仍亠仍仆舒 于亠亳 舒仆亟舒仆
舒仍亞仂亳仄仂于
于亞亠仆亳亶 从仂
e.s.krutko@gmail.com
舒亳仂仆舒仍仆亶 亳仍亠亟仂于舒亠仍从亳亶 亠仆 "舒仂于从亳亶 亳仆亳"
25.02.2017
亅于仂仍ム亳 仄仆仂亞仂仗仂仂仆仂亶 舒弍仂 于 C++
舒仄 仆亢仆仂 于仗仂仍仆亳 舒弍仂 舒亳仆仂仆仆仂
1 int main(){
2 //Here we should use some features to call doWork in parallel
3 doWork(int a);
4 doSomeOtherWork(double t);
5 //Ensure doWork completed
6 return 0;
7 }
舒于仆仄-亟舒于仆仂...
...  仆舒 仆亠 弍仍仂 亟舒亢亠 舒仆亟舒舒 C++11.
1 //Using POSIX API
2 void* makeDoWork(void *arg) {
3 int *a=reinterpret_cast<int*>(arg);
4 doWork(*a);
5 }
6 int main(){
7 pthread_t thread;
8 int value = 42;
9 pthread_create(
10 &thread,
11 nullptr,
12 makeDoWork,
13 &value);
14 doSomeOtherWork(double t);
15 pthread_join(thread, nullptr);
16 return 0;
17 }
舒于仆仄-亟舒于仆仂...
...  仆舒 仆亠 弍仍仂 亟舒亢亠 舒仆亟舒舒 C++11.
1 //Using Win API
2 DWORD WINAPI makeDoWork(void *arg) {
3 int *a=reinterpret_cast<int*>(arg);
4 doWork(*a);
5 }
6 int main(){
7 HANDLE thread;
8 int value = 42;
9 thread = CreateThread(
10 NULL,
11 0,
12 makeDoWork,
13 &value,
14 0,
15 NULL
16 );
17 doSomeOtherWork(double t);
18 WaitForSingleObject(thread, INFINITE);
19 return 0;
20 }
仂-仗仍舒仂仄亠仆仆亶 仗仂亟仂亟
 亟亞亳亠
舒亳仆舒 仂 舒仆亟舒舒 C++11
std::thread
std::async / std::future
1 int main(int argc, char**argv) {
2 std::thread thread;
3 int value;
4 //Do doWork() in new thread
5 thread = std::thread(
6 doWork,
7 std::ref(value));
8 //Do someything else in this thread
9 doSomeOtherWork();
10 //Whait for doWork() finishes
11 thread.join();
12 return 0;
13 }
舒亳仆舒 仂 舒仆亟舒舒 C++11
std::thread
std::async / std::future
1 int main(int argc, char**argv) {
2 int value;
3 //Do doWork() in new thread
4 auto future = std::async(
5 std::launch::async;
6 doWork,
7 std::ref(value));
8 //Do someything else in this thread
9 doSomeOtherWork();
10 //Whait for doWork() finishes
11 future.get();
12 return 0;
13 }
舒仄 亳 仂亞仂 仄舒仍仂, 仂亠 亠亠 仗仂亠
仂亰仄仂亢仆仂 从仂亞亟舒-仆亳弍亟 :)
1 auto auto(auto auto) { auto; }
舒仄 亳 仂亞仂 仄舒仍仂, 仂亠 亠亠 仗仂亠
仂亰仄仂亢仆仂 从仂亞亟舒-仆亳弍亟 :)
1 auto auto(auto auto) { auto; }
丕亢亠 /仗仂亳/ 于 舒仆亟舒亠
1 //Something from <algorythm>
2 std::some_standard_algorythm_with_stl_containers(
3 std::begin(container),
4 std::end(container)
5 );
6 //The same but with specification of execution policy
7 std::some_standard_algorythm_with_stl_containers(
8 ExecutionPolicy policy,
9 std::begin(container),
10 std::end(container)
11 );
仍亞仂亳仄 舒仆亟舒仆仂亶 弍亳弍仍亳仂亠从亳, 亟仂仗仆亠 于
仗舒舒仍仍亠仍仆仂仄 亠亢亳仄亠
弍磦仍亠仆 于 亰舒亞仂仍仂于仂仆仂仄 舒亶仍亠 <algorithm>
仂从舒 于 舒亟亳亳 TS 于 亰舒亞仂仍仂于仂仆仂仄 舒亶仍亠
<experimental/algorithm>
adjacent_difference adjacent_find all_of any_of
copy copy_if copy_n count
count_if equal exclusive_scan fill
fill_n find find_end find_first_of
find_if find_if_not for_each for_each_n
generate generate_n includes inclusive_scan
inner_product inplace_merge is_heap is_heap_until
is_partitioned is_sorted is_sorted_until lexicographical_compare
max_element merge min_element minmax_element
mismatch move none_of nth_element
partial_sort partial_sort_copy partition partition_copy
reduce remove remove_copy remove_copy_if
remove_if replace replace_copy replace_copy_if
replace_if reverse reverse_copy rotate
rotate_copy search search_n set_difference
set_intersection set_symmetric_difference set_union sort
stable_partition stable_sort swap_ranges transform
transform_exclusive_scan transform_inclusive_scan transform_reduce uninitialized_copy
uninitialized_copy_n uninitialized_fill uninitialized_fill_n unique
unique_copy
仂仍亳亳从亳 于仗仂仍仆亠仆亳
1 //Available from <execution_policy>
2 //While in TS stage from <experimental/execution_policy>
3
4 //Plain old sequenced execution
5 constexpr sequential_execution_policy seq{ };
6 //Parallel execution
7 constexpr parallel_execution_policy par{ };
8 //Parallel with SIMD instructions
9 constexpr parallel_vector_execution_policy par_vec{ };
仂仍亳亳从亳 于仗仂仍仆亠仆亳
1 //Available from <execution_policy>
2 //While in TS stage from <experimental/execution_policy>
3
4 //Plain old sequenced execution
5 constexpr sequential_execution_policy seq{ };
6 //Parallel execution
7 constexpr parallel_execution_policy par{ };
8 //Parallel with SIMD instructions
9 constexpr parallel_vector_execution_policy par_vec{ };
弌亠仍 亠弍亠 仗仂 仆仂亞舒仄 亠仗亠 仄仂亢仆仂 亠亠 仂亟仆亳仄 亳亰仆仄
仗仂仂弍仂仄
1 int a[] = {0,1};
2 std::vector<int> v;
3 std::for_each(std::par,
4 std::begin(a),
5 std::end(a),
6 [&](int i) {
7 v.push_back(i*2+1); // Error: data race
8 });
舒亶亠 亟于亠!
舒从 亢亠 仗仂仗仂弍仂于舒? 亰 亟仂从仄亠仆舒
https://isocpp.org/files/papers/P0024R2.html
Microsoft MS ParallelSTL page
HPX HPX github
Codeplay Sycl github
HSA HSA for math science page
Thibaut Lutz github
NVIDIA github
http://github.com/eskrut/ParallelSTL.git
丐亠仂于舒 亰舒亟舒舒 #1
弍仆舒 亠舒仍亳亰舒亳
1 auto vec = makeShuffledVector();
2 double baseDuration = 0;
3
4 auto vecToSort = vec;
5 {
6 Stopwatch sw("plain sort");
7 std::sort(std::begin(vecToSort), std::end(vecToSort));
8 baseDuration = sw.duration();
9 }
10 if (! std::is_sorted(std::begin(vecToSort), std::end(vecToSort)))
11 throw std::runtime_error("Failed with plain sort");
丐亠仂于舒 亰舒亟舒舒 #1
弌 仗仂仍亠亟仂于舒亠仍仆仂亶 仗仂仍亳亳从仂亶
1 //This includes should be from ${T_LUTZ_ROOT}/include
2 #include <numeric>
3 #include <experimental/algorithm>
4
5 /* --- */
6
7 vecToSort = vec;
8 {
9 Stopwatch sw("seq sort", baseDuration);
10 sort(std::experimental::parallel::seq,
11 std::begin(vecToSort), std::end(vecToSort));
12 }
13 if (! std::is_sorted(std::begin(vecToSort), std::end(vecToSort)))
14 throw std::runtime_error("Failed with plain sort");
丐亠仂于舒 亰舒亟舒舒 #1
弌 仗舒舒仍仍亠仍仆仂亶 仗仂仍亳亳从仂亶
1 //This includes should be from ${T_LUTZ_ROOT}/include
2 #include <numeric>
3 #include <experimental/algorithm>
4
5 /* --- */
6
7 vecToSort = vec;
8 {
9 Stopwatch sw("par sort", baseDuration);
10 sort(std::experimental::parallel::par,
11 std::begin(vecToSort), std::end(vecToSort));
12 }
13 if (! std::is_sorted(std::begin(vecToSort), std::end(vecToSort)))
14 throw std::runtime_error("Failed with plain sort");
丐亠仂于舒 亰舒亟舒舒 #1
弌 仗仂仍亠亟仂于舒亠仍仆仂亶 仗仂仍亳亳从仂亶
1 #include "hpx/hpx_init.hpp"
2 #include "hpx/hpx.hpp"
3
4 #include "hpx/parallel/numeric.hpp"
5 #include "hpx/parallel/algorithm.hpp"
6
7 /* --- */
8
9 vecToSort = vec;
10 {
11 Stopwatch sw("seq sort", baseDuration);
12 hpx::parallel::sort(hpx::parallel::seq,
13 std::begin(vecToSort), std::end(vecToSort));
14 }
15 if (! std::is_sorted(std::begin(vecToSort), std::end(vecToSort)))
16 throw std::runtime_error("Failed with seq sort");
丐亠仂于舒 亰舒亟舒舒 #1
弌 仗舒舒仍仍亠仍仆仂亶 仗仂仍亳亳从仂亶
1 #include "hpx/hpx_init.hpp"
2 #include "hpx/hpx.hpp"
3
4 #include "hpx/parallel/numeric.hpp"
5 #include "hpx/parallel/algorithm.hpp"
6
7 /* --- */
8
9 vecToSort = vec;
10 {
11 Stopwatch sw("par sort", baseDuration);
12 hpx::parallel::sort(hpx::parallel::par,
13 std::begin(vecToSort), std::end(vecToSort));
14 }
15 if (! std::is_sorted(std::begin(vecToSort), std::end(vecToSort)))
16 throw std::runtime_error("Failed with par sort");
丐亠仂于舒 亰舒亟舒舒 #1
弌 仗舒舒仍仍亠仍仆仂亶 亳 于亠从仂亳亰仂于舒仆仆仂亶 仗仂仍亳亳从仂亶
1 #include "hpx/hpx_init.hpp"
2 #include "hpx/hpx.hpp"
3
4 #include "hpx/parallel/numeric.hpp"
5 #include "hpx/parallel/algorithm.hpp"
6
7 /* --- */
8
9 vecToSort = vec;
10 {
11 Stopwatch sw("par_vec sort", baseDuration);
12 hpx::parallel::sort(hpx::parallel::par_vec,
13 std::begin(vecToSort), std::end(vecToSort));
14 }
15 if (! std::is_sorted(std::begin(vecToSort), std::end(vecToSort)))
16 throw std::runtime_error("Failed with par_vec sort");
丐亠仂于舒 亰舒亟舒舒 #2
弍仆舒 亠舒仍亳亰舒亳
1 const size_t numParts = std::thread::hardware_concurrency()*2 > 0 ?
2 std::thread::hardware_concurrency() * 2 : 8;
3 std::list<std::vector<size_t>> listOfVecs;
4 listOfVecs.resize(numParts);
5 std::generate(listOfVecs.begin(),
6 listOfVecs.end(),
7 [&](){ return makeShuffledVector(memoryToAlloc/numParts);}
8 );
9 double baseDuration = 0;
10 auto list = listOfVecs;
11 {
12 Stopwatch sw("plain for, plain sort");
13 for(auto &vecToSort : list)
14 std::sort(std::begin(vecToSort), std::end(vecToSort));
15 baseDuration = sw.duration();
16 }
17 for(const auto &vecToSort : list)
18 if (! std::is_sorted(std::begin(vecToSort), std::end(vecToSort)))
19 throw std::runtime_error("Failed with plain for, plain sort");
丐亠仂于舒 亰舒亟舒舒 #2
仂仍亠亟仂于舒亠仍仆亶 for, 仗舒舒仍仍亠仍仆亶 sort
1 for(auto &vecToSort : list)
2 sort(std::experimental::parallel::par,
3 std::begin(vecToSort), std::end(vecToSort));
4
5 /* --- */
6
7 for(auto &vecToSort : list)
8 hpx::parallel::sort(hpx::parallel::par,
9 std::begin(vecToSort),
10 std::end(vecToSort));
丐亠仂于舒 亰舒亟舒舒 #2
舒舒仍仍亠仍仆亶 for, 仗仂仍亠亟仂于舒亠仍仆亶 sort
1 for_each(std::experimental::parallel::par,
2 std::begin(list), std::end(list),
3 [](std::vector<size_t> &vecToSort){
4 std::sort(std::begin(vecToSort), std::end(vecToSort));
5 });
6
7 /* --- */
8
9 hpx::parallel::for_each(hpx::parallel::par,
10 std::begin(list), std::end(list),
11 [](std::vector<size_t> &vecToSort){
12 std::sort(std::begin(vecToSort), std::end(vecToSort));
13 });
丐亠仂于舒 亰舒亟舒舒 #2
舒舒仍仍亠仍仆亶 for, 仗舒舒仍仍亠仍仆亶 sort
[仗舒舒仍仍亠仍仆亶 于 从于舒亟舒亠, 从于舒亟舒仆仂 仗舒舒仍仍亠仍仆亶]
1 for_each(std::experimental::parallel::par,
2 std::begin(list), std::end(list),
3 [](std::vector<size_t> &vecToSort){
4 sort(std::experimental::parallel::par,
5 std::begin(vecToSort), std::end(vecToSort));
6 });
7
8 /* --- */
9
10 hpx::parallel::for_each(hpx::parallel::par,
11 std::begin(list), std::end(list),
12 [](std::vector<size_t> &vecToSort){
13 hpx::parallel::sort(hpx::parallel::par,
14 std::begin(vecToSort), std::end(vecToSort));
15 });
亠亰仍舒
[2 亳亰亳亠从亳, 4 h-threading 磲舒]
丐亠 #1
亠舒仍亳亰舒亳 仂仍亳亳从舒 丕从仂亠仆亳亠
t-lutz
seq 1
par 2.37
HPX
seq 0.99
par 2.61
par_vec 2.64
丐亠 #2
亠舒仍亳亰舒亳 仂仍亳亳从舒 for 仂仍亳亳从舒 sort 丕从仂亠仆亳亠
t-lutz
seq par 2.26
par seq 2.78
par par 2.48
HPX
seq par 2.52
par seq 2.75
par par 2.87
Race!
仂亞仆舒 亳 仗亠亠亞仆舒!
1 for(auto &vecToSort : list)
2 std::sort(std::begin(vecToSort), std::end(vecToSort));
3
4 /* --- */
5
6 for_each(std::experimental::parallel::par,
7 std::begin(list), std::end(list),
8 [](std::vector<size_t> &vecToSort){
9 sort(std::experimental::parallel::par,
10 std::begin(vecToSort), std::end(vecToSort));
Race!
1 auto work=[](decltype(list.end()) begin,decltype(list.end()) end){
2 for(auto it = begin; it != end; ++it)
3 std::sort(it->begin(), it->end());
4 };
5 size_t hc = std::thread::hardware_concurrency();
6 if(hc == 0) hc = 8;
7 auto numThreads = std::min(list.size(), hc);
8 auto chunkPerThread = list.size() / numThreads;
9 auto threadBegin = list.begin();
10 auto threadEnd = threadBegin;
11 std::advance(threadEnd, chunkPerThread);
12 std::list<std::future<void>> futures;
13 for(size_t thId = 0; thId < numThreads - 1; ++thId){
14 futures.push_back(std::async(std::launch::async,
15 work, threadBegin, threadEnd));
16 threadBegin = threadEnd;
17 std::advance(threadEnd, chunkPerThread);
18 }
19 work(threadBegin, list.end());
20 for(auto &f : futures) f.get();
 仗仂弍亠亟亳亠仍亠仄 舒仍...
[2 亳亰亳亠从亳, 4 h-threading 磲舒]
丐亠 #2
亠舒仍亳亰舒亳 仂仍亳亳从舒 丕从仂亠仆亳亠 仂仍亳亠于仂 仂从
Parallel STL par/par 2.5 2
mine async/seq 2.5 20
亳仆舒仄亳亠从亳亠 仗仂仍亳亳从亳
1 std::experimental::parallel::execution_policy outerPolicy =
2 std::experimental::parallel::seq;
3 std::experimental::parallel::execution_policy innerPolicy =
4 std::experimental::parallel::par;
5
6 /* Decide at runtime which policy should be */
7 outerPolicy = std::experimental::parallel::par;
8 innerPolicy = std::experimental::parallel::par_vec;
9
10 for_each(outerPolicy,
11 std::begin(list), std::end(list),
12 [&innerPolicy](std::vector<size_t> &vecToSort){
13 sort(innerPolicy,
14 std::begin(vecToSort),
15 std::end(vecToSort));
16 });
仍亳 仂-仂 仗仂仍仂 仆亠 舒从
1 struct Processor
2 {
3 void doWork(size_t id) {
4 throw std::runtime_error("`o卒o_ from " + std::to_string(id));
5 }
6 };
7
8 std::vector<Processor> processors;
9 processors.resize(25);
10
11 try {
12 std::cout << "Plain for" << std::endl;
13 std::for_each(processors.begin(), processors.end(),
14 [&](Processor &p){
15 p.doWork(&p - processors.data());
16 });
17 }
18 catch(std::exception &e) {
19 std::cout << e.what() << std::endl;
20 }
仂于亳仄 亳从仍ム亠仆亳
1 try {
2 std::cout << "Seq for" << std::endl;
3 hpx::parallel::for_each(hpx::parallel::seq,
4 processors.begin(), processors.end(),
5 [&](Processor &p){
6 p.doWork(&p - processors.data());
7 });
8 }
9 catch(hpx::parallel::exception_list &list) {
10 std::cout << "Exception list what: " << list.what() << std::endl;
11 std::cout << "Total " << list.size() << " exceptions:" << std::
endl;
12 for(auto &e : list) {
13 try{ boost::rethrow_exception(e); }
14 catch(std::exception &e){
15 std::cout << "twhat: " << e.what() << std::endl;
16 }
17 }
18 }
19 catch(std::exception &e){
20 std::cout << e.what() << std::endl;
21 }
仂于亳仄 亳从仍ム亠仆亳
Plain for
`o_卒o from 0
Seq for
Exception list what: HPX(unknown_error)
Total 1 exceptions:
what: HPX(unknown_error)
Par for
Exception list what: HPX(unknown_error)
Total 13 exceptions:
what: `o_卒o from 0
what: `o_卒o from 2
what: `o_卒o from 4
what: `o_卒o from 6
what: `o_卒o from 8
what: `o_卒o from 10
what: `o_卒o from 12
what: `o_卒o from 14
what: `o_卒o from 16
what: `o_卒o from 18
what: `o_卒o from 20
what: `o_卒o from 22
what: `o_卒o from 24
舒 亟亠亠
Parallelism Extension for STL 亠亠 仆亠 亠舒仍亳亰仂于舒仆仂 于
从仂仄仗亳仍仂舒.
1 #include <algorithm>
2
3 std::some_standard_algorythm_with_stl_containers(
4 std::begin(container),
5 std::end(container)
6 );
仂 亠仍亳 亳仗仂仍亰亠 gcc, 仂...
舒 亟亠亠
Parallelism Extension for STL 亠亠 仆亠 亠舒仍亳亰仂于舒仆仂 于
从仂仄仗亳仍仂舒.
1 #include <algorithm>
2
3 std::some_standard_algorythm_with_stl_containers(
4 std::begin(container),
5 std::end(container)
6 );
仂 亠仍亳 亳仗仂仍亰亠 gcc, 仂...
1 //OpenMP should be enabled
2
3 #include <parallel/algorithm>
4
5 std::__parallel::some_standard_algorythm_with_stl_containers(
6 std::begin(container),
7 std::end(container)
8 );
丐亠 亢亠 舒仄亠 仗亳仄亠
1 std::__parallel::sort(std::begin(vecToSort), std::end(vecToSort));
2
3 std::__parallel::for_each(std::begin(list), std::end(list),
4 [](std::vector<size_t> &vecToSort){
5 std::__parallel::sort(std::begin(vecToSort), std::end(
vecToSort));
6 });
7
8 #pragma omp parallel
9 {
10 #pragma omp single
11 {
12 for(auto it = list.begin(); it != list.end(); ++it)
13 #pragma omp task
14 sort(it->begin(), it->end());
15 }
16 }
亠亰仍舒
[2 亳亰亳亠从亳, 4 h-threading 磲舒]
丐亠 #2
亠舒仍亳亰舒亳 仂仍亳亳从舒 丕从仂亠仆亳亠 仂仍亳亠于仂 仂从
Parallel STL par/par 2.5 2
mine (std::async) async/seq 2.5 20
Parallel gcc par/par 2.5 2
mine (openmp) task/seq 2.5 9

More Related Content

What's hot (20)

仄亳亳亶 舒亳仆, 丐仂仍仍亠亶弍 亳亰 弍舒仆从亳: 舒仍亳舒亳仆亞 亳 于亠从仂亳亰舒亳 于 LLVM
仄亳亳亶 舒亳仆, 丐仂仍仍亠亶弍 亳亰 弍舒仆从亳: 舒仍亳舒亳仆亞 亳 于亠从仂亳亰舒亳 于 LLVM仄亳亳亶 舒亳仆, 丐仂仍仍亠亶弍 亳亰 弍舒仆从亳: 舒仍亳舒亳仆亞 亳 于亠从仂亳亰舒亳 于 LLVM
仄亳亳亶 舒亳仆, 丐仂仍仍亠亶弍 亳亰 弍舒仆从亳: 舒仍亳舒亳仆亞 亳 于亠从仂亳亰舒亳 于 LLVM
Sergey Platonov
仍 亠亞仂 仄 亟亠仍舒仍亳 于仂亶 舒从仂仆亶 亠亶仄于仂从 亳 仂 亳亰 仂亞仂 于仍仂?
仍 亠亞仂 仄 亟亠仍舒仍亳 于仂亶 舒从仂仆亶 亠亶仄于仂从 亳 仂 亳亰 仂亞仂 于仍仂?仍 亠亞仂 仄 亟亠仍舒仍亳 于仂亶 舒从仂仆亶 亠亶仄于仂从 亳 仂 亳亰 仂亞仂 于仍仂?
仍 亠亞仂 仄 亟亠仍舒仍亳 于仂亶 舒从仂仆亶 亠亶仄于仂从 亳 仂 亳亰 仂亞仂 于仍仂?
Yauheni Akhotnikau
仂亞仆舒 亳 仗亠亠亞仆舒 boost::lexical_cast
仂亞仆舒 亳 仗亠亠亞仆舒 boost::lexical_cast仂亞仆舒 亳 仗亠亠亞仆舒 boost::lexical_cast
仂亞仆舒 亳 仗亠亠亞仆舒 boost::lexical_cast
Roman Orlov
丐 - 于亠仆舒 2015 - 亠从亳 6. 舒亰舒弍仂从舒 仗舒舒仍仍亠仍仆 从 亟舒仆仆 仆舒 仂仆仂于...
丐 - 于亠仆舒 2015 - 亠从亳 6. 舒亰舒弍仂从舒 仗舒舒仍仍亠仍仆 从 亟舒仆仆 仆舒 仂仆仂于...丐 - 于亠仆舒 2015 - 亠从亳 6. 舒亰舒弍仂从舒 仗舒舒仍仍亠仍仆 从 亟舒仆仆 仆舒 仂仆仂于...
丐 - 于亠仆舒 2015 - 亠从亳 6. 舒亰舒弍仂从舒 仗舒舒仍仍亠仍仆 从 亟舒仆仆 仆舒 仂仆仂于...
Alexey Paznikov
丐 - 于亠仆舒 2015 - 亠从亳 5. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 于 弌++. 弌亳仆仂仆亳亰舒...
丐 - 于亠仆舒 2015 - 亠从亳 5. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 于 弌++. 弌亳仆仂仆亳亰舒...丐 - 于亠仆舒 2015 - 亠从亳 5. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 于 弌++. 弌亳仆仂仆亳亰舒...
丐 - 于亠仆舒 2015 - 亠从亳 5. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 于 弌++. 弌亳仆仂仆亳亰舒...
Alexey Paznikov
丐 - 仂亠仆 2014 - 亠从亳 4 - 弌舒仆亟舒 POSIX Threads. 亠亠仆亠舒弍亠仍仆仂. 弌亳亞仆...
丐 - 仂亠仆 2014 - 亠从亳 4 - 弌舒仆亟舒 POSIX Threads. 亠亠仆亠舒弍亠仍仆仂. 弌亳亞仆...丐 - 仂亠仆 2014 - 亠从亳 4 - 弌舒仆亟舒 POSIX Threads. 亠亠仆亠舒弍亠仍仆仂. 弌亳亞仆...
丐 - 仂亠仆 2014 - 亠从亳 4 - 弌舒仆亟舒 POSIX Threads. 亠亠仆亠舒弍亠仍仆仂. 弌亳亞仆...
Alexey Paznikov
丐 - 仂亠仆 2014 - 亠从亳 7. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 弍亠亰 弍仍仂从亳仂于仂从. ...
丐 - 仂亠仆 2014 - 亠从亳 7. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 弍亠亰 弍仍仂从亳仂于仂从. ...丐 - 仂亠仆 2014 - 亠从亳 7. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 弍亠亰 弍仍仂从亳仂于仂从. ...
丐 - 仂亠仆 2014 - 亠从亳 7. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 弍亠亰 弍仍仂从亳仂于仂从. ...
Alexey Paznikov
仂于亠亟仆亠于仆亶 弌++: 舒仍亞仂亳仄 亳 亳亠舒仂 @ C++ Russia 2017
仂于亠亟仆亠于仆亶 弌++: 舒仍亞仂亳仄 亳 亳亠舒仂 @ C++ Russia 2017仂于亠亟仆亠于仆亶 弌++: 舒仍亞仂亳仄 亳 亳亠舒仂 @ C++ Russia 2017
仂于亠亟仆亠于仆亶 弌++: 舒仍亞仂亳仄 亳 亳亠舒仂 @ C++ Russia 2017
Mikhail Matrosov
丐 - 仂亠仆 2014 - 亠从亳 5 - 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 于 磶从亠 弌++. ...
丐 - 仂亠仆 2014 - 亠从亳 5 - 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 于 磶从亠 弌++.   ...丐 - 仂亠仆 2014 - 亠从亳 5 - 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 于 磶从亠 弌++.   ...
丐 - 仂亠仆 2014 - 亠从亳 5 - 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 于 磶从亠 弌++. ...
Alexey Paznikov
丐 - 于亠仆舒 2015 - 亠从亳 8. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 弍亠亰 亳仗仂仍亰仂于舒仆亳...
丐 - 于亠仆舒 2015 - 亠从亳 8. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 弍亠亰 亳仗仂仍亰仂于舒仆亳...丐 - 于亠仆舒 2015 - 亠从亳 8. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 弍亠亰 亳仗仂仍亰仂于舒仆亳...
丐 - 于亠仆舒 2015 - 亠从亳 8. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 弍亠亰 亳仗仂仍亰仂于舒仆亳...
Alexey Paznikov
仂亟亠仍 仗舒仄亳 C++ - 仆亟亠亶 亊仆从仂于从亳亶, 亊仆亟亠从
仂亟亠仍 仗舒仄亳 C++ - 仆亟亠亶 亊仆从仂于从亳亶, 亊仆亟亠从仂亟亠仍 仗舒仄亳 C++ - 仆亟亠亶 亊仆从仂于从亳亶, 亊仆亟亠从
仂亟亠仍 仗舒仄亳 C++ - 仆亟亠亶 亊仆从仂于从亳亶, 亊仆亟亠从
Yandex
个亳仆亠 亟仍 于舒亠亞仂 从仂亟舒: 从舒从 亟亠亢舒 亠亞仂 于 仂仄亠
个亳仆亠 亟仍 于舒亠亞仂 从仂亟舒: 从舒从 亟亠亢舒 亠亞仂 于 仂仄亠个亳仆亠 亟仍 于舒亠亞仂 从仂亟舒: 从舒从 亟亠亢舒 亠亞仂 于 仂仄亠
个亳仆亠 亟仍 于舒亠亞仂 从仂亟舒: 从舒从 亟亠亢舒 亠亞仂 于 仂仄亠
Ilia Shishkov
丐 - 于亠仆舒 2015 - 亠从亳 3. 亠亠仆亠舒弍亠仍仆仂. 弌亳亞仆舒仍. 仂从舒仍仆亠 亟舒仆仆亠 仗仂...
丐 - 于亠仆舒 2015 - 亠从亳 3. 亠亠仆亠舒弍亠仍仆仂. 弌亳亞仆舒仍. 仂从舒仍仆亠 亟舒仆仆亠 仗仂...丐 - 于亠仆舒 2015 - 亠从亳 3. 亠亠仆亠舒弍亠仍仆仂. 弌亳亞仆舒仍. 仂从舒仍仆亠 亟舒仆仆亠 仗仂...
丐 - 于亠仆舒 2015 - 亠从亳 3. 亠亠仆亠舒弍亠仍仆仂. 弌亳亞仆舒仍. 仂从舒仍仆亠 亟舒仆仆亠 仗仂...
Alexey Paznikov
丐 - 于亠仆舒 2015 - 亠从亳 7. 仂亟亠仍 仗舒仄亳 弌++. 仆亠仂亠亠亟仆仂亠 于仗仂仍仆亠仆亳亠 亳仆...
丐 - 于亠仆舒 2015 - 亠从亳 7. 仂亟亠仍 仗舒仄亳 弌++. 仆亠仂亠亠亟仆仂亠 于仗仂仍仆亠仆亳亠 亳仆...丐 - 于亠仆舒 2015 - 亠从亳 7. 仂亟亠仍 仗舒仄亳 弌++. 仆亠仂亠亠亟仆仂亠 于仗仂仍仆亠仆亳亠 亳仆...
丐 - 于亠仆舒 2015 - 亠从亳 7. 仂亟亠仍 仗舒仄亳 弌++. 仆亠仂亠亠亟仆仂亠 于仗仂仍仆亠仆亳亠 亳仆...
Alexey Paznikov
仍舒亞亳仆 .., 舒亰仆亳从仂于 .., 仆仂仂于 .. 仗亳仄亳亰舒亳 亳仆仂仄舒亳仂仆仆 仂弍仄亠仆仂于...
仍舒亞亳仆 .., 舒亰仆亳从仂于 .., 仆仂仂于 .. 仗亳仄亳亰舒亳 亳仆仂仄舒亳仂仆仆 仂弍仄亠仆仂于...仍舒亞亳仆 .., 舒亰仆亳从仂于 .., 仆仂仂于 .. 仗亳仄亳亰舒亳 亳仆仂仄舒亳仂仆仆 仂弍仄亠仆仂于...
仍舒亞亳仆 .., 舒亰仆亳从仂于 .., 仆仂仂于 .. 仗亳仄亳亰舒亳 亳仆仂仄舒亳仂仆仆 仂弍仄亠仆仂于...
Alexey Paznikov
弍亠从仆仂-仂亳亠仆亳仂于舒仆仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠. 亠从亳 5 亳 6
弍亠从仆仂-仂亳亠仆亳仂于舒仆仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠. 亠从亳 5 亳 6弍亠从仆仂-仂亳亠仆亳仂于舒仆仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠. 亠从亳 5 亳 6
弍亠从仆仂-仂亳亠仆亳仂于舒仆仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠. 亠从亳 5 亳 6
Dima Dzuba
弌仂于亠仄亠仆仆亶 舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒: 仂 仄亠亠 仂仆, 亠亞仂 仆亠 仄亠仍亳 仍亳仆亠
弌仂于亠仄亠仆仆亶 舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒: 仂 仄亠亠 仂仆, 亠亞仂 仆亠 仄亠仍亳 仍亳仆亠弌仂于亠仄亠仆仆亶 舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒: 仂 仄亠亠 仂仆, 亠亞仂 仆亠 仄亠仍亳 仍亳仆亠
弌仂于亠仄亠仆仆亶 舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒: 仂 仄亠亠 仂仆, 亠亞仂 仆亠 仄亠仍亳 仍亳仆亠
corehard_by
亠从仂仂亠 仗舒亠仆 亠舒仍亳亰舒亳亳 仗仂仍亳仄仂仆仂亞仂 仗仂于亠亟亠仆亳 于 C++ 仄亳亳亶 亠于舒仆仂于,...
亠从仂仂亠 仗舒亠仆 亠舒仍亳亰舒亳亳 仗仂仍亳仄仂仆仂亞仂 仗仂于亠亟亠仆亳 于 C++  仄亳亳亶 亠于舒仆仂于,...亠从仂仂亠 仗舒亠仆 亠舒仍亳亰舒亳亳 仗仂仍亳仄仂仆仂亞仂 仗仂于亠亟亠仆亳 于 C++  仄亳亳亶 亠于舒仆仂于,...
亠从仂仂亠 仗舒亠仆 亠舒仍亳亰舒亳亳 仗仂仍亳仄仂仆仂亞仂 仗仂于亠亟亠仆亳 于 C++ 仄亳亳亶 亠于舒仆仂于,...
Yandex
仗仂仍亰仂于舒仆亳亠 舒弍仍仂仆仂于 亳 RTTI 亟仍 从仂仆亳亞舒亳亳 亳仄仍仂舒 仍亠-仆舒从仂仗亳亠仍 - ...
仗仂仍亰仂于舒仆亳亠 舒弍仍仂仆仂于 亳 RTTI 亟仍 从仂仆亳亞舒亳亳 亳仄仍仂舒 仍亠-仆舒从仂仗亳亠仍 - ...仗仂仍亰仂于舒仆亳亠 舒弍仍仂仆仂于 亳 RTTI 亟仍 从仂仆亳亞舒亳亳 亳仄仍仂舒 仍亠-仆舒从仂仗亳亠仍 - ...
仗仂仍亰仂于舒仆亳亠 舒弍仍仂仆仂于 亳 RTTI 亟仍 从仂仆亳亞舒亳亳 亳仄仍仂舒 仍亠-仆舒从仂仗亳亠仍 - ...
Yandex
弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒 弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
Pavel Tsukanov
仄亳亳亶 舒亳仆, 丐仂仍仍亠亶弍 亳亰 弍舒仆从亳: 舒仍亳舒亳仆亞 亳 于亠从仂亳亰舒亳 于 LLVM
仄亳亳亶 舒亳仆, 丐仂仍仍亠亶弍 亳亰 弍舒仆从亳: 舒仍亳舒亳仆亞 亳 于亠从仂亳亰舒亳 于 LLVM仄亳亳亶 舒亳仆, 丐仂仍仍亠亶弍 亳亰 弍舒仆从亳: 舒仍亳舒亳仆亞 亳 于亠从仂亳亰舒亳 于 LLVM
仄亳亳亶 舒亳仆, 丐仂仍仍亠亶弍 亳亰 弍舒仆从亳: 舒仍亳舒亳仆亞 亳 于亠从仂亳亰舒亳 于 LLVM
Sergey Platonov
仍 亠亞仂 仄 亟亠仍舒仍亳 于仂亶 舒从仂仆亶 亠亶仄于仂从 亳 仂 亳亰 仂亞仂 于仍仂?
仍 亠亞仂 仄 亟亠仍舒仍亳 于仂亶 舒从仂仆亶 亠亶仄于仂从 亳 仂 亳亰 仂亞仂 于仍仂?仍 亠亞仂 仄 亟亠仍舒仍亳 于仂亶 舒从仂仆亶 亠亶仄于仂从 亳 仂 亳亰 仂亞仂 于仍仂?
仍 亠亞仂 仄 亟亠仍舒仍亳 于仂亶 舒从仂仆亶 亠亶仄于仂从 亳 仂 亳亰 仂亞仂 于仍仂?
Yauheni Akhotnikau
仂亞仆舒 亳 仗亠亠亞仆舒 boost::lexical_cast
仂亞仆舒 亳 仗亠亠亞仆舒 boost::lexical_cast仂亞仆舒 亳 仗亠亠亞仆舒 boost::lexical_cast
仂亞仆舒 亳 仗亠亠亞仆舒 boost::lexical_cast
Roman Orlov
丐 - 于亠仆舒 2015 - 亠从亳 6. 舒亰舒弍仂从舒 仗舒舒仍仍亠仍仆 从 亟舒仆仆 仆舒 仂仆仂于...
丐 - 于亠仆舒 2015 - 亠从亳 6. 舒亰舒弍仂从舒 仗舒舒仍仍亠仍仆 从 亟舒仆仆 仆舒 仂仆仂于...丐 - 于亠仆舒 2015 - 亠从亳 6. 舒亰舒弍仂从舒 仗舒舒仍仍亠仍仆 从 亟舒仆仆 仆舒 仂仆仂于...
丐 - 于亠仆舒 2015 - 亠从亳 6. 舒亰舒弍仂从舒 仗舒舒仍仍亠仍仆 从 亟舒仆仆 仆舒 仂仆仂于...
Alexey Paznikov
丐 - 于亠仆舒 2015 - 亠从亳 5. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 于 弌++. 弌亳仆仂仆亳亰舒...
丐 - 于亠仆舒 2015 - 亠从亳 5. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 于 弌++. 弌亳仆仂仆亳亰舒...丐 - 于亠仆舒 2015 - 亠从亳 5. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 于 弌++. 弌亳仆仂仆亳亰舒...
丐 - 于亠仆舒 2015 - 亠从亳 5. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 于 弌++. 弌亳仆仂仆亳亰舒...
Alexey Paznikov
丐 - 仂亠仆 2014 - 亠从亳 4 - 弌舒仆亟舒 POSIX Threads. 亠亠仆亠舒弍亠仍仆仂. 弌亳亞仆...
丐 - 仂亠仆 2014 - 亠从亳 4 - 弌舒仆亟舒 POSIX Threads. 亠亠仆亠舒弍亠仍仆仂. 弌亳亞仆...丐 - 仂亠仆 2014 - 亠从亳 4 - 弌舒仆亟舒 POSIX Threads. 亠亠仆亠舒弍亠仍仆仂. 弌亳亞仆...
丐 - 仂亠仆 2014 - 亠从亳 4 - 弌舒仆亟舒 POSIX Threads. 亠亠仆亠舒弍亠仍仆仂. 弌亳亞仆...
Alexey Paznikov
丐 - 仂亠仆 2014 - 亠从亳 7. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 弍亠亰 弍仍仂从亳仂于仂从. ...
丐 - 仂亠仆 2014 - 亠从亳 7. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 弍亠亰 弍仍仂从亳仂于仂从. ...丐 - 仂亠仆 2014 - 亠从亳 7. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 弍亠亰 弍仍仂从亳仂于仂从. ...
丐 - 仂亠仆 2014 - 亠从亳 7. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 弍亠亰 弍仍仂从亳仂于仂从. ...
Alexey Paznikov
仂于亠亟仆亠于仆亶 弌++: 舒仍亞仂亳仄 亳 亳亠舒仂 @ C++ Russia 2017
仂于亠亟仆亠于仆亶 弌++: 舒仍亞仂亳仄 亳 亳亠舒仂 @ C++ Russia 2017仂于亠亟仆亠于仆亶 弌++: 舒仍亞仂亳仄 亳 亳亠舒仂 @ C++ Russia 2017
仂于亠亟仆亠于仆亶 弌++: 舒仍亞仂亳仄 亳 亳亠舒仂 @ C++ Russia 2017
Mikhail Matrosov
丐 - 仂亠仆 2014 - 亠从亳 5 - 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 于 磶从亠 弌++. ...
丐 - 仂亠仆 2014 - 亠从亳 5 - 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 于 磶从亠 弌++.   ...丐 - 仂亠仆 2014 - 亠从亳 5 - 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 于 磶从亠 弌++.   ...
丐 - 仂亠仆 2014 - 亠从亳 5 - 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 于 磶从亠 弌++. ...
Alexey Paznikov
丐 - 于亠仆舒 2015 - 亠从亳 8. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 弍亠亰 亳仗仂仍亰仂于舒仆亳...
丐 - 于亠仆舒 2015 - 亠从亳 8. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 弍亠亰 亳仗仂仍亰仂于舒仆亳...丐 - 于亠仆舒 2015 - 亠从亳 8. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 弍亠亰 亳仗仂仍亰仂于舒仆亳...
丐 - 于亠仆舒 2015 - 亠从亳 8. 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠 弍亠亰 亳仗仂仍亰仂于舒仆亳...
Alexey Paznikov
仂亟亠仍 仗舒仄亳 C++ - 仆亟亠亶 亊仆从仂于从亳亶, 亊仆亟亠从
仂亟亠仍 仗舒仄亳 C++ - 仆亟亠亶 亊仆从仂于从亳亶, 亊仆亟亠从仂亟亠仍 仗舒仄亳 C++ - 仆亟亠亶 亊仆从仂于从亳亶, 亊仆亟亠从
仂亟亠仍 仗舒仄亳 C++ - 仆亟亠亶 亊仆从仂于从亳亶, 亊仆亟亠从
Yandex
个亳仆亠 亟仍 于舒亠亞仂 从仂亟舒: 从舒从 亟亠亢舒 亠亞仂 于 仂仄亠
个亳仆亠 亟仍 于舒亠亞仂 从仂亟舒: 从舒从 亟亠亢舒 亠亞仂 于 仂仄亠个亳仆亠 亟仍 于舒亠亞仂 从仂亟舒: 从舒从 亟亠亢舒 亠亞仂 于 仂仄亠
个亳仆亠 亟仍 于舒亠亞仂 从仂亟舒: 从舒从 亟亠亢舒 亠亞仂 于 仂仄亠
Ilia Shishkov
丐 - 于亠仆舒 2015 - 亠从亳 3. 亠亠仆亠舒弍亠仍仆仂. 弌亳亞仆舒仍. 仂从舒仍仆亠 亟舒仆仆亠 仗仂...
丐 - 于亠仆舒 2015 - 亠从亳 3. 亠亠仆亠舒弍亠仍仆仂. 弌亳亞仆舒仍. 仂从舒仍仆亠 亟舒仆仆亠 仗仂...丐 - 于亠仆舒 2015 - 亠从亳 3. 亠亠仆亠舒弍亠仍仆仂. 弌亳亞仆舒仍. 仂从舒仍仆亠 亟舒仆仆亠 仗仂...
丐 - 于亠仆舒 2015 - 亠从亳 3. 亠亠仆亠舒弍亠仍仆仂. 弌亳亞仆舒仍. 仂从舒仍仆亠 亟舒仆仆亠 仗仂...
Alexey Paznikov
丐 - 于亠仆舒 2015 - 亠从亳 7. 仂亟亠仍 仗舒仄亳 弌++. 仆亠仂亠亠亟仆仂亠 于仗仂仍仆亠仆亳亠 亳仆...
丐 - 于亠仆舒 2015 - 亠从亳 7. 仂亟亠仍 仗舒仄亳 弌++. 仆亠仂亠亠亟仆仂亠 于仗仂仍仆亠仆亳亠 亳仆...丐 - 于亠仆舒 2015 - 亠从亳 7. 仂亟亠仍 仗舒仄亳 弌++. 仆亠仂亠亠亟仆仂亠 于仗仂仍仆亠仆亳亠 亳仆...
丐 - 于亠仆舒 2015 - 亠从亳 7. 仂亟亠仍 仗舒仄亳 弌++. 仆亠仂亠亠亟仆仂亠 于仗仂仍仆亠仆亳亠 亳仆...
Alexey Paznikov
仍舒亞亳仆 .., 舒亰仆亳从仂于 .., 仆仂仂于 .. 仗亳仄亳亰舒亳 亳仆仂仄舒亳仂仆仆 仂弍仄亠仆仂于...
仍舒亞亳仆 .., 舒亰仆亳从仂于 .., 仆仂仂于 .. 仗亳仄亳亰舒亳 亳仆仂仄舒亳仂仆仆 仂弍仄亠仆仂于...仍舒亞亳仆 .., 舒亰仆亳从仂于 .., 仆仂仂于 .. 仗亳仄亳亰舒亳 亳仆仂仄舒亳仂仆仆 仂弍仄亠仆仂于...
仍舒亞亳仆 .., 舒亰仆亳从仂于 .., 仆仂仂于 .. 仗亳仄亳亰舒亳 亳仆仂仄舒亳仂仆仆 仂弍仄亠仆仂于...
Alexey Paznikov
弍亠从仆仂-仂亳亠仆亳仂于舒仆仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠. 亠从亳 5 亳 6
弍亠从仆仂-仂亳亠仆亳仂于舒仆仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠. 亠从亳 5 亳 6弍亠从仆仂-仂亳亠仆亳仂于舒仆仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠. 亠从亳 5 亳 6
弍亠从仆仂-仂亳亠仆亳仂于舒仆仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠. 亠从亳 5 亳 6
Dima Dzuba
弌仂于亠仄亠仆仆亶 舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒: 仂 仄亠亠 仂仆, 亠亞仂 仆亠 仄亠仍亳 仍亳仆亠
弌仂于亠仄亠仆仆亶 舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒: 仂 仄亠亠 仂仆, 亠亞仂 仆亠 仄亠仍亳 仍亳仆亠弌仂于亠仄亠仆仆亶 舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒: 仂 仄亠亠 仂仆, 亠亞仂 仆亠 仄亠仍亳 仍亳仆亠
弌仂于亠仄亠仆仆亶 舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒: 仂 仄亠亠 仂仆, 亠亞仂 仆亠 仄亠仍亳 仍亳仆亠
corehard_by
亠从仂仂亠 仗舒亠仆 亠舒仍亳亰舒亳亳 仗仂仍亳仄仂仆仂亞仂 仗仂于亠亟亠仆亳 于 C++ 仄亳亳亶 亠于舒仆仂于,...
亠从仂仂亠 仗舒亠仆 亠舒仍亳亰舒亳亳 仗仂仍亳仄仂仆仂亞仂 仗仂于亠亟亠仆亳 于 C++  仄亳亳亶 亠于舒仆仂于,...亠从仂仂亠 仗舒亠仆 亠舒仍亳亰舒亳亳 仗仂仍亳仄仂仆仂亞仂 仗仂于亠亟亠仆亳 于 C++  仄亳亳亶 亠于舒仆仂于,...
亠从仂仂亠 仗舒亠仆 亠舒仍亳亰舒亳亳 仗仂仍亳仄仂仆仂亞仂 仗仂于亠亟亠仆亳 于 C++ 仄亳亳亶 亠于舒仆仂于,...
Yandex
仗仂仍亰仂于舒仆亳亠 舒弍仍仂仆仂于 亳 RTTI 亟仍 从仂仆亳亞舒亳亳 亳仄仍仂舒 仍亠-仆舒从仂仗亳亠仍 - ...
仗仂仍亰仂于舒仆亳亠 舒弍仍仂仆仂于 亳 RTTI 亟仍 从仂仆亳亞舒亳亳 亳仄仍仂舒 仍亠-仆舒从仂仗亳亠仍 - ...仗仂仍亰仂于舒仆亳亠 舒弍仍仂仆仂于 亳 RTTI 亟仍 从仂仆亳亞舒亳亳 亳仄仍仂舒 仍亠-仆舒从仂仗亳亠仍 - ...
仗仂仍亰仂于舒仆亳亠 舒弍仍仂仆仂于 亳 RTTI 亟仍 从仂仆亳亞舒亳亳 亳仄仍仂舒 仍亠-仆舒从仂仗亳亠仍 - ...
Yandex
弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒 弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
Pavel Tsukanov

Similar to Parallel STL (20)

仗亳仄亳亰舒亳 舒亳仂于舒仆亳 亳仗仂仍亰仂于舒仆亳亠仄 Expression templates
仗亳仄亳亰舒亳 舒亳仂于舒仆亳  亳仗仂仍亰仂于舒仆亳亠仄 Expression templates仗亳仄亳亰舒亳 舒亳仂于舒仆亳  亳仗仂仍亰仂于舒仆亳亠仄 Expression templates
仗亳仄亳亰舒亳 舒亳仂于舒仆亳 亳仗仂仍亰仂于舒仆亳亠仄 Expression templates
Platonov Sergey
仗亳仄亳亰舒亳 舒亳仂于舒仆亳 亳仗仂仍亰仂于舒仆亳亠仄 Expression templates
仗亳仄亳亰舒亳 舒亳仂于舒仆亳  亳仗仂仍亰仂于舒仆亳亠仄 Expression templates仗亳仄亳亰舒亳 舒亳仂于舒仆亳  亳仗仂仍亰仂于舒仆亳亠仄 Expression templates
仗亳仄亳亰舒亳 舒亳仂于舒仆亳 亳仗仂仍亰仂于舒仆亳亠仄 Expression templates
Platonov Sergey
舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
Andrey Karpov
弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒: 丼仂? 舒从? 舒亠仄?
弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒: 丼仂? 舒从? 舒亠仄?弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒: 丼仂? 舒从? 舒亠仄?
弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒: 丼仂? 舒从? 舒亠仄?
Andrey Karpov
亳仆亳仗 舒弍仂 舒亳亠从仂亞仂 舒仆舒仍亳亰舒仂舒 从仂亟舒 PVS-Studio
亳仆亳仗 舒弍仂 舒亳亠从仂亞仂 舒仆舒仍亳亰舒仂舒 从仂亟舒 PVS-Studio亳仆亳仗 舒弍仂 舒亳亠从仂亞仂 舒仆舒仍亳亰舒仂舒 从仂亟舒 PVS-Studio
亳仆亳仗 舒弍仂 舒亳亠从仂亞仂 舒仆舒仍亳亰舒仂舒 从仂亟舒 PVS-Studio
Andrey Karpov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
Computer Science Club
丕仍亠仆亳亠 从舒亠于舒 仂从仂亞仂 仗仂亞舒仄仄仆仂亞仂 仂弍亠仗亠亠仆亳 仗仂仄仂 亳仆仄亠仆仂于 ...
丕仍亠仆亳亠 从舒亠于舒 仂从仂亞仂 仗仂亞舒仄仄仆仂亞仂 仂弍亠仗亠亠仆亳  仗仂仄仂 亳仆仄亠仆仂于 ...丕仍亠仆亳亠 从舒亠于舒 仂从仂亞仂 仗仂亞舒仄仄仆仂亞仂 仂弍亠仗亠亠仆亳  仗仂仄仂 亳仆仄亠仆仂于 ...
丕仍亠仆亳亠 从舒亠于舒 仂从仂亞仂 仗仂亞舒仄仄仆仂亞仂 仂弍亠仗亠亠仆亳 仗仂仄仂 亳仆仄亠仆仂于 ...
Andrey Karpov
JavaDay'14
JavaDay'14JavaDay'14
JavaDay'14
Kirill Golodnov
亠从亳 7: 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠: 舒 3 (OpenMP)
亠从亳 7: 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠: 舒 3 (OpenMP)亠从亳 7: 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠: 舒 3 (OpenMP)
亠从亳 7: 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠: 舒 3 (OpenMP)
Mikhail Kurnosov
亠从亳 7: 个亳弍仂仆舒亳亠于 从亳 (Fibonacci heaps)
亠从亳 7: 个亳弍仂仆舒亳亠于 从亳 (Fibonacci heaps)亠从亳 7: 个亳弍仂仆舒亳亠于 从亳 (Fibonacci heaps)
亠从亳 7: 个亳弍仂仆舒亳亠于 从亳 (Fibonacci heaps)
Mikhail Kurnosov
亠从亳 6. 弌舒仆亟舒 OpenMP
亠从亳 6. 弌舒仆亟舒 OpenMP亠从亳 6. 弌舒仆亟舒 OpenMP
亠从亳 6. 弌舒仆亟舒 OpenMP
Mikhail Kurnosov
亠从亳 6. 弌舒仆亟舒 OpenMP
亠从亳 6. 弌舒仆亟舒 OpenMP亠从亳 6. 弌舒仆亟舒 OpenMP
亠从亳 6. 弌舒仆亟舒 OpenMP
Mikhail Kurnosov
豫仍亳 仂于舒仍于舒. Fscheck 舒仍亠仆舒亳于仆亶 仗 亟仍 unit 亠仂于
豫仍亳 仂于舒仍于舒. Fscheck  舒仍亠仆舒亳于仆亶 仗 亟仍 unit 亠仂于豫仍亳 仂于舒仍于舒. Fscheck  舒仍亠仆舒亳于仆亶 仗 亟仍 unit 亠仂于
豫仍亳 仂于舒仍于舒. Fscheck 舒仍亠仆舒亳于仆亶 仗 亟仍 unit 亠仂于
MskDotNet Community
仂 舒亳亠从仂仄 舒仆舒仍亳亰亠 从仂亟舒 亟仍 Java 仗仂亞舒仄仄亳舒
 仂 舒亳亠从仂仄 舒仆舒仍亳亰亠 从仂亟舒 亟仍 Java 仗仂亞舒仄仄亳舒 仂 舒亳亠从仂仄 舒仆舒仍亳亰亠 从仂亟舒 亟仍 Java 仗仂亞舒仄仄亳舒
仂 舒亳亠从仂仄 舒仆舒仍亳亰亠 从仂亟舒 亟仍 Java 仗仂亞舒仄仄亳舒
Andrey Karpov
弌舒亳亠从亳亶 舒仆舒仍亳亰: 于仂从亞 Java 亰舒 60 仄亳仆
弌舒亳亠从亳亶 舒仆舒仍亳亰: 于仂从亞 Java 亰舒 60 仄亳仆弌舒亳亠从亳亶 舒仆舒仍亳亰: 于仂从亞 Java 亰舒 60 仄亳仆
弌舒亳亠从亳亶 舒仆舒仍亳亰: 于仂从亞 Java 亰舒 60 仄亳仆
Andrey Karpov
弌舒亳亠从亳亶 舒仆舒仍亳亰: 仂亳弍从亳 于 仄亠亟亳舒仗仍亠亠亠 亳 弍亠亰亞仍ム仆舒 舒从舒
弌舒亳亠从亳亶 舒仆舒仍亳亰: 仂亳弍从亳 于 仄亠亟亳舒仗仍亠亠亠 亳 弍亠亰亞仍ム仆舒 舒从舒 弌舒亳亠从亳亶 舒仆舒仍亳亰: 仂亳弍从亳 于 仄亠亟亳舒仗仍亠亠亠 亳 弍亠亰亞仍ム仆舒 舒从舒
弌舒亳亠从亳亶 舒仆舒仍亳亰: 仂亳弍从亳 于 仄亠亟亳舒仗仍亠亠亠 亳 弍亠亰亞仍ム仆舒 舒从舒
Tatyanazaxarova
仗 舒亰舒弍仂从亳 舒亳亠从仂亞仂 舒仆舒仍亳亰舒仂舒 从仂亟舒
仗 舒亰舒弍仂从亳 舒亳亠从仂亞仂 舒仆舒仍亳亰舒仂舒 从仂亟舒仗 舒亰舒弍仂从亳 舒亳亠从仂亞仂 舒仆舒仍亳亰舒仂舒 从仂亟舒
仗 舒亰舒弍仂从亳 舒亳亠从仂亞仂 舒仆舒仍亳亰舒仂舒 从仂亟舒
Andrey Karpov
仄亳亳亶 仂从仂仗亠于 R-仍从亳 于 弌++11
仄亳亳亶 仂从仂仗亠于  R-仍从亳 于 弌++11仄亳亳亶 仂从仂仗亠于  R-仍从亳 于 弌++11
仄亳亳亶 仂从仂仗亠于 R-仍从亳 于 弌++11
Yandex
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1
Michael Karpov
仗亳仄亳亰舒亳 舒亳仂于舒仆亳 亳仗仂仍亰仂于舒仆亳亠仄 Expression templates
仗亳仄亳亰舒亳 舒亳仂于舒仆亳  亳仗仂仍亰仂于舒仆亳亠仄 Expression templates仗亳仄亳亰舒亳 舒亳仂于舒仆亳  亳仗仂仍亰仂于舒仆亳亠仄 Expression templates
仗亳仄亳亰舒亳 舒亳仂于舒仆亳 亳仗仂仍亰仂于舒仆亳亠仄 Expression templates
Platonov Sergey
仗亳仄亳亰舒亳 舒亳仂于舒仆亳 亳仗仂仍亰仂于舒仆亳亠仄 Expression templates
仗亳仄亳亰舒亳 舒亳仂于舒仆亳  亳仗仂仍亰仂于舒仆亳亠仄 Expression templates仗亳仄亳亰舒亳 舒亳仂于舒仆亳  亳仗仂仍亰仂于舒仆亳亠仄 Expression templates
仗亳仄亳亰舒亳 舒亳仂于舒仆亳 亳仗仂仍亰仂于舒仆亳亠仄 Expression templates
Platonov Sergey
舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒
Andrey Karpov
弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒: 丼仂? 舒从? 舒亠仄?
弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒: 丼仂? 舒从? 舒亠仄?弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒: 丼仂? 舒从? 舒亠仄?
弌舒亳亠从亳亶 舒仆舒仍亳亰 从仂亟舒: 丼仂? 舒从? 舒亠仄?
Andrey Karpov
亳仆亳仗 舒弍仂 舒亳亠从仂亞仂 舒仆舒仍亳亰舒仂舒 从仂亟舒 PVS-Studio
亳仆亳仗 舒弍仂 舒亳亠从仂亞仂 舒仆舒仍亳亰舒仂舒 从仂亟舒 PVS-Studio亳仆亳仗 舒弍仂 舒亳亠从仂亞仂 舒仆舒仍亳亰舒仂舒 从仂亟舒 PVS-Studio
亳仆亳仗 舒弍仂 舒亳亠从仂亞仂 舒仆舒仍亳亰舒仂舒 从仂亟舒 PVS-Studio
Andrey Karpov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
Computer Science Club
丕仍亠仆亳亠 从舒亠于舒 仂从仂亞仂 仗仂亞舒仄仄仆仂亞仂 仂弍亠仗亠亠仆亳 仗仂仄仂 亳仆仄亠仆仂于 ...
丕仍亠仆亳亠 从舒亠于舒 仂从仂亞仂 仗仂亞舒仄仄仆仂亞仂 仂弍亠仗亠亠仆亳  仗仂仄仂 亳仆仄亠仆仂于 ...丕仍亠仆亳亠 从舒亠于舒 仂从仂亞仂 仗仂亞舒仄仄仆仂亞仂 仂弍亠仗亠亠仆亳  仗仂仄仂 亳仆仄亠仆仂于 ...
丕仍亠仆亳亠 从舒亠于舒 仂从仂亞仂 仗仂亞舒仄仄仆仂亞仂 仂弍亠仗亠亠仆亳 仗仂仄仂 亳仆仄亠仆仂于 ...
Andrey Karpov
亠从亳 7: 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠: 舒 3 (OpenMP)
亠从亳 7: 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠: 舒 3 (OpenMP)亠从亳 7: 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠: 舒 3 (OpenMP)
亠从亳 7: 仆仂亞仂仗仂仂仆仂亠 仗仂亞舒仄仄亳仂于舒仆亳亠: 舒 3 (OpenMP)
Mikhail Kurnosov
亠从亳 7: 个亳弍仂仆舒亳亠于 从亳 (Fibonacci heaps)
亠从亳 7: 个亳弍仂仆舒亳亠于 从亳 (Fibonacci heaps)亠从亳 7: 个亳弍仂仆舒亳亠于 从亳 (Fibonacci heaps)
亠从亳 7: 个亳弍仂仆舒亳亠于 从亳 (Fibonacci heaps)
Mikhail Kurnosov
亠从亳 6. 弌舒仆亟舒 OpenMP
亠从亳 6. 弌舒仆亟舒 OpenMP亠从亳 6. 弌舒仆亟舒 OpenMP
亠从亳 6. 弌舒仆亟舒 OpenMP
Mikhail Kurnosov
亠从亳 6. 弌舒仆亟舒 OpenMP
亠从亳 6. 弌舒仆亟舒 OpenMP亠从亳 6. 弌舒仆亟舒 OpenMP
亠从亳 6. 弌舒仆亟舒 OpenMP
Mikhail Kurnosov
豫仍亳 仂于舒仍于舒. Fscheck 舒仍亠仆舒亳于仆亶 仗 亟仍 unit 亠仂于
豫仍亳 仂于舒仍于舒. Fscheck  舒仍亠仆舒亳于仆亶 仗 亟仍 unit 亠仂于豫仍亳 仂于舒仍于舒. Fscheck  舒仍亠仆舒亳于仆亶 仗 亟仍 unit 亠仂于
豫仍亳 仂于舒仍于舒. Fscheck 舒仍亠仆舒亳于仆亶 仗 亟仍 unit 亠仂于
MskDotNet Community
仂 舒亳亠从仂仄 舒仆舒仍亳亰亠 从仂亟舒 亟仍 Java 仗仂亞舒仄仄亳舒
 仂 舒亳亠从仂仄 舒仆舒仍亳亰亠 从仂亟舒 亟仍 Java 仗仂亞舒仄仄亳舒 仂 舒亳亠从仂仄 舒仆舒仍亳亰亠 从仂亟舒 亟仍 Java 仗仂亞舒仄仄亳舒
仂 舒亳亠从仂仄 舒仆舒仍亳亰亠 从仂亟舒 亟仍 Java 仗仂亞舒仄仄亳舒
Andrey Karpov
弌舒亳亠从亳亶 舒仆舒仍亳亰: 于仂从亞 Java 亰舒 60 仄亳仆
弌舒亳亠从亳亶 舒仆舒仍亳亰: 于仂从亞 Java 亰舒 60 仄亳仆弌舒亳亠从亳亶 舒仆舒仍亳亰: 于仂从亞 Java 亰舒 60 仄亳仆
弌舒亳亠从亳亶 舒仆舒仍亳亰: 于仂从亞 Java 亰舒 60 仄亳仆
Andrey Karpov
弌舒亳亠从亳亶 舒仆舒仍亳亰: 仂亳弍从亳 于 仄亠亟亳舒仗仍亠亠亠 亳 弍亠亰亞仍ム仆舒 舒从舒
弌舒亳亠从亳亶 舒仆舒仍亳亰: 仂亳弍从亳 于 仄亠亟亳舒仗仍亠亠亠 亳 弍亠亰亞仍ム仆舒 舒从舒 弌舒亳亠从亳亶 舒仆舒仍亳亰: 仂亳弍从亳 于 仄亠亟亳舒仗仍亠亠亠 亳 弍亠亰亞仍ム仆舒 舒从舒
弌舒亳亠从亳亶 舒仆舒仍亳亰: 仂亳弍从亳 于 仄亠亟亳舒仗仍亠亠亠 亳 弍亠亰亞仍ム仆舒 舒从舒
Tatyanazaxarova
仗 舒亰舒弍仂从亳 舒亳亠从仂亞仂 舒仆舒仍亳亰舒仂舒 从仂亟舒
仗 舒亰舒弍仂从亳 舒亳亠从仂亞仂 舒仆舒仍亳亰舒仂舒 从仂亟舒仗 舒亰舒弍仂从亳 舒亳亠从仂亞仂 舒仆舒仍亳亰舒仂舒 从仂亟舒
仗 舒亰舒弍仂从亳 舒亳亠从仂亞仂 舒仆舒仍亳亰舒仂舒 从仂亟舒
Andrey Karpov
仄亳亳亶 仂从仂仗亠于 R-仍从亳 于 弌++11
仄亳亳亶 仂从仂仗亠于  R-仍从亳 于 弌++11仄亳亳亶 仂从仂仗亠于  R-仍从亳 于 弌++11
仄亳亳亶 仂从仂仗亠于 R-仍从亳 于 弌++11
Yandex
20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1
Michael Karpov

Parallel STL

  • 1. C++17: 仗舒舒仍仍亠仍仆舒 于亠亳 舒仆亟舒仆 舒仍亞仂亳仄仂于 于亞亠仆亳亶 从仂 e.s.krutko@gmail.com 舒亳仂仆舒仍仆亶 亳仍亠亟仂于舒亠仍从亳亶 亠仆 "舒仂于从亳亶 亳仆亳" 25.02.2017
  • 2. 亅于仂仍ム亳 仄仆仂亞仂仗仂仂仆仂亶 舒弍仂 于 C++ 舒仄 仆亢仆仂 于仗仂仍仆亳 舒弍仂 舒亳仆仂仆仆仂 1 int main(){ 2 //Here we should use some features to call doWork in parallel 3 doWork(int a); 4 doSomeOtherWork(double t); 5 //Ensure doWork completed 6 return 0; 7 }
  • 3. 舒于仆仄-亟舒于仆仂... ... 仆舒 仆亠 弍仍仂 亟舒亢亠 舒仆亟舒舒 C++11. 1 //Using POSIX API 2 void* makeDoWork(void *arg) { 3 int *a=reinterpret_cast<int*>(arg); 4 doWork(*a); 5 } 6 int main(){ 7 pthread_t thread; 8 int value = 42; 9 pthread_create( 10 &thread, 11 nullptr, 12 makeDoWork, 13 &value); 14 doSomeOtherWork(double t); 15 pthread_join(thread, nullptr); 16 return 0; 17 }
  • 4. 舒于仆仄-亟舒于仆仂... ... 仆舒 仆亠 弍仍仂 亟舒亢亠 舒仆亟舒舒 C++11. 1 //Using Win API 2 DWORD WINAPI makeDoWork(void *arg) { 3 int *a=reinterpret_cast<int*>(arg); 4 doWork(*a); 5 } 6 int main(){ 7 HANDLE thread; 8 int value = 42; 9 thread = CreateThread( 10 NULL, 11 0, 12 makeDoWork, 13 &value, 14 0, 15 NULL 16 ); 17 doSomeOtherWork(double t); 18 WaitForSingleObject(thread, INFINITE); 19 return 0; 20 }
  • 6. 舒亳仆舒 仂 舒仆亟舒舒 C++11 std::thread std::async / std::future 1 int main(int argc, char**argv) { 2 std::thread thread; 3 int value; 4 //Do doWork() in new thread 5 thread = std::thread( 6 doWork, 7 std::ref(value)); 8 //Do someything else in this thread 9 doSomeOtherWork(); 10 //Whait for doWork() finishes 11 thread.join(); 12 return 0; 13 }
  • 7. 舒亳仆舒 仂 舒仆亟舒舒 C++11 std::thread std::async / std::future 1 int main(int argc, char**argv) { 2 int value; 3 //Do doWork() in new thread 4 auto future = std::async( 5 std::launch::async; 6 doWork, 7 std::ref(value)); 8 //Do someything else in this thread 9 doSomeOtherWork(); 10 //Whait for doWork() finishes 11 future.get(); 12 return 0; 13 }
  • 8. 舒仄 亳 仂亞仂 仄舒仍仂, 仂亠 亠亠 仗仂亠 仂亰仄仂亢仆仂 从仂亞亟舒-仆亳弍亟 :) 1 auto auto(auto auto) { auto; }
  • 9. 舒仄 亳 仂亞仂 仄舒仍仂, 仂亠 亠亠 仗仂亠 仂亰仄仂亢仆仂 从仂亞亟舒-仆亳弍亟 :) 1 auto auto(auto auto) { auto; } 丕亢亠 /仗仂亳/ 于 舒仆亟舒亠 1 //Something from <algorythm> 2 std::some_standard_algorythm_with_stl_containers( 3 std::begin(container), 4 std::end(container) 5 ); 6 //The same but with specification of execution policy 7 std::some_standard_algorythm_with_stl_containers( 8 ExecutionPolicy policy, 9 std::begin(container), 10 std::end(container) 11 );
  • 10. 仍亞仂亳仄 舒仆亟舒仆仂亶 弍亳弍仍亳仂亠从亳, 亟仂仗仆亠 于 仗舒舒仍仍亠仍仆仂仄 亠亢亳仄亠 弍磦仍亠仆 于 亰舒亞仂仍仂于仂仆仂仄 舒亶仍亠 <algorithm> 仂从舒 于 舒亟亳亳 TS 于 亰舒亞仂仍仂于仂仆仂仄 舒亶仍亠 <experimental/algorithm> adjacent_difference adjacent_find all_of any_of copy copy_if copy_n count count_if equal exclusive_scan fill fill_n find find_end find_first_of find_if find_if_not for_each for_each_n generate generate_n includes inclusive_scan inner_product inplace_merge is_heap is_heap_until is_partitioned is_sorted is_sorted_until lexicographical_compare max_element merge min_element minmax_element mismatch move none_of nth_element partial_sort partial_sort_copy partition partition_copy reduce remove remove_copy remove_copy_if remove_if replace replace_copy replace_copy_if replace_if reverse reverse_copy rotate rotate_copy search search_n set_difference set_intersection set_symmetric_difference set_union sort stable_partition stable_sort swap_ranges transform transform_exclusive_scan transform_inclusive_scan transform_reduce uninitialized_copy uninitialized_copy_n uninitialized_fill uninitialized_fill_n unique unique_copy
  • 11. 仂仍亳亳从亳 于仗仂仍仆亠仆亳 1 //Available from <execution_policy> 2 //While in TS stage from <experimental/execution_policy> 3 4 //Plain old sequenced execution 5 constexpr sequential_execution_policy seq{ }; 6 //Parallel execution 7 constexpr parallel_execution_policy par{ }; 8 //Parallel with SIMD instructions 9 constexpr parallel_vector_execution_policy par_vec{ };
  • 12. 仂仍亳亳从亳 于仗仂仍仆亠仆亳 1 //Available from <execution_policy> 2 //While in TS stage from <experimental/execution_policy> 3 4 //Plain old sequenced execution 5 constexpr sequential_execution_policy seq{ }; 6 //Parallel execution 7 constexpr parallel_execution_policy par{ }; 8 //Parallel with SIMD instructions 9 constexpr parallel_vector_execution_policy par_vec{ }; 弌亠仍 亠弍亠 仗仂 仆仂亞舒仄 亠仗亠 仄仂亢仆仂 亠亠 仂亟仆亳仄 亳亰仆仄 仗仂仂弍仂仄 1 int a[] = {0,1}; 2 std::vector<int> v; 3 std::for_each(std::par, 4 std::begin(a), 5 std::end(a), 6 [&](int i) { 7 v.push_back(i*2+1); // Error: data race 8 });
  • 13. 舒亶亠 亟于亠! 舒从 亢亠 仗仂仗仂弍仂于舒? 亰 亟仂从仄亠仆舒 https://isocpp.org/files/papers/P0024R2.html Microsoft MS ParallelSTL page HPX HPX github Codeplay Sycl github HSA HSA for math science page Thibaut Lutz github NVIDIA github http://github.com/eskrut/ParallelSTL.git
  • 14. 丐亠仂于舒 亰舒亟舒舒 #1 弍仆舒 亠舒仍亳亰舒亳 1 auto vec = makeShuffledVector(); 2 double baseDuration = 0; 3 4 auto vecToSort = vec; 5 { 6 Stopwatch sw("plain sort"); 7 std::sort(std::begin(vecToSort), std::end(vecToSort)); 8 baseDuration = sw.duration(); 9 } 10 if (! std::is_sorted(std::begin(vecToSort), std::end(vecToSort))) 11 throw std::runtime_error("Failed with plain sort");
  • 15. 丐亠仂于舒 亰舒亟舒舒 #1 弌 仗仂仍亠亟仂于舒亠仍仆仂亶 仗仂仍亳亳从仂亶 1 //This includes should be from ${T_LUTZ_ROOT}/include 2 #include <numeric> 3 #include <experimental/algorithm> 4 5 /* --- */ 6 7 vecToSort = vec; 8 { 9 Stopwatch sw("seq sort", baseDuration); 10 sort(std::experimental::parallel::seq, 11 std::begin(vecToSort), std::end(vecToSort)); 12 } 13 if (! std::is_sorted(std::begin(vecToSort), std::end(vecToSort))) 14 throw std::runtime_error("Failed with plain sort");
  • 16. 丐亠仂于舒 亰舒亟舒舒 #1 弌 仗舒舒仍仍亠仍仆仂亶 仗仂仍亳亳从仂亶 1 //This includes should be from ${T_LUTZ_ROOT}/include 2 #include <numeric> 3 #include <experimental/algorithm> 4 5 /* --- */ 6 7 vecToSort = vec; 8 { 9 Stopwatch sw("par sort", baseDuration); 10 sort(std::experimental::parallel::par, 11 std::begin(vecToSort), std::end(vecToSort)); 12 } 13 if (! std::is_sorted(std::begin(vecToSort), std::end(vecToSort))) 14 throw std::runtime_error("Failed with plain sort");
  • 17. 丐亠仂于舒 亰舒亟舒舒 #1 弌 仗仂仍亠亟仂于舒亠仍仆仂亶 仗仂仍亳亳从仂亶 1 #include "hpx/hpx_init.hpp" 2 #include "hpx/hpx.hpp" 3 4 #include "hpx/parallel/numeric.hpp" 5 #include "hpx/parallel/algorithm.hpp" 6 7 /* --- */ 8 9 vecToSort = vec; 10 { 11 Stopwatch sw("seq sort", baseDuration); 12 hpx::parallel::sort(hpx::parallel::seq, 13 std::begin(vecToSort), std::end(vecToSort)); 14 } 15 if (! std::is_sorted(std::begin(vecToSort), std::end(vecToSort))) 16 throw std::runtime_error("Failed with seq sort");
  • 18. 丐亠仂于舒 亰舒亟舒舒 #1 弌 仗舒舒仍仍亠仍仆仂亶 仗仂仍亳亳从仂亶 1 #include "hpx/hpx_init.hpp" 2 #include "hpx/hpx.hpp" 3 4 #include "hpx/parallel/numeric.hpp" 5 #include "hpx/parallel/algorithm.hpp" 6 7 /* --- */ 8 9 vecToSort = vec; 10 { 11 Stopwatch sw("par sort", baseDuration); 12 hpx::parallel::sort(hpx::parallel::par, 13 std::begin(vecToSort), std::end(vecToSort)); 14 } 15 if (! std::is_sorted(std::begin(vecToSort), std::end(vecToSort))) 16 throw std::runtime_error("Failed with par sort");
  • 19. 丐亠仂于舒 亰舒亟舒舒 #1 弌 仗舒舒仍仍亠仍仆仂亶 亳 于亠从仂亳亰仂于舒仆仆仂亶 仗仂仍亳亳从仂亶 1 #include "hpx/hpx_init.hpp" 2 #include "hpx/hpx.hpp" 3 4 #include "hpx/parallel/numeric.hpp" 5 #include "hpx/parallel/algorithm.hpp" 6 7 /* --- */ 8 9 vecToSort = vec; 10 { 11 Stopwatch sw("par_vec sort", baseDuration); 12 hpx::parallel::sort(hpx::parallel::par_vec, 13 std::begin(vecToSort), std::end(vecToSort)); 14 } 15 if (! std::is_sorted(std::begin(vecToSort), std::end(vecToSort))) 16 throw std::runtime_error("Failed with par_vec sort");
  • 20. 丐亠仂于舒 亰舒亟舒舒 #2 弍仆舒 亠舒仍亳亰舒亳 1 const size_t numParts = std::thread::hardware_concurrency()*2 > 0 ? 2 std::thread::hardware_concurrency() * 2 : 8; 3 std::list<std::vector<size_t>> listOfVecs; 4 listOfVecs.resize(numParts); 5 std::generate(listOfVecs.begin(), 6 listOfVecs.end(), 7 [&](){ return makeShuffledVector(memoryToAlloc/numParts);} 8 ); 9 double baseDuration = 0; 10 auto list = listOfVecs; 11 { 12 Stopwatch sw("plain for, plain sort"); 13 for(auto &vecToSort : list) 14 std::sort(std::begin(vecToSort), std::end(vecToSort)); 15 baseDuration = sw.duration(); 16 } 17 for(const auto &vecToSort : list) 18 if (! std::is_sorted(std::begin(vecToSort), std::end(vecToSort))) 19 throw std::runtime_error("Failed with plain for, plain sort");
  • 21. 丐亠仂于舒 亰舒亟舒舒 #2 仂仍亠亟仂于舒亠仍仆亶 for, 仗舒舒仍仍亠仍仆亶 sort 1 for(auto &vecToSort : list) 2 sort(std::experimental::parallel::par, 3 std::begin(vecToSort), std::end(vecToSort)); 4 5 /* --- */ 6 7 for(auto &vecToSort : list) 8 hpx::parallel::sort(hpx::parallel::par, 9 std::begin(vecToSort), 10 std::end(vecToSort));
  • 22. 丐亠仂于舒 亰舒亟舒舒 #2 舒舒仍仍亠仍仆亶 for, 仗仂仍亠亟仂于舒亠仍仆亶 sort 1 for_each(std::experimental::parallel::par, 2 std::begin(list), std::end(list), 3 [](std::vector<size_t> &vecToSort){ 4 std::sort(std::begin(vecToSort), std::end(vecToSort)); 5 }); 6 7 /* --- */ 8 9 hpx::parallel::for_each(hpx::parallel::par, 10 std::begin(list), std::end(list), 11 [](std::vector<size_t> &vecToSort){ 12 std::sort(std::begin(vecToSort), std::end(vecToSort)); 13 });
  • 23. 丐亠仂于舒 亰舒亟舒舒 #2 舒舒仍仍亠仍仆亶 for, 仗舒舒仍仍亠仍仆亶 sort [仗舒舒仍仍亠仍仆亶 于 从于舒亟舒亠, 从于舒亟舒仆仂 仗舒舒仍仍亠仍仆亶] 1 for_each(std::experimental::parallel::par, 2 std::begin(list), std::end(list), 3 [](std::vector<size_t> &vecToSort){ 4 sort(std::experimental::parallel::par, 5 std::begin(vecToSort), std::end(vecToSort)); 6 }); 7 8 /* --- */ 9 10 hpx::parallel::for_each(hpx::parallel::par, 11 std::begin(list), std::end(list), 12 [](std::vector<size_t> &vecToSort){ 13 hpx::parallel::sort(hpx::parallel::par, 14 std::begin(vecToSort), std::end(vecToSort)); 15 });
  • 24. 亠亰仍舒 [2 亳亰亳亠从亳, 4 h-threading 磲舒] 丐亠 #1 亠舒仍亳亰舒亳 仂仍亳亳从舒 丕从仂亠仆亳亠 t-lutz seq 1 par 2.37 HPX seq 0.99 par 2.61 par_vec 2.64 丐亠 #2 亠舒仍亳亰舒亳 仂仍亳亳从舒 for 仂仍亳亳从舒 sort 丕从仂亠仆亳亠 t-lutz seq par 2.26 par seq 2.78 par par 2.48 HPX seq par 2.52 par seq 2.75 par par 2.87
  • 25. Race! 仂亞仆舒 亳 仗亠亠亞仆舒! 1 for(auto &vecToSort : list) 2 std::sort(std::begin(vecToSort), std::end(vecToSort)); 3 4 /* --- */ 5 6 for_each(std::experimental::parallel::par, 7 std::begin(list), std::end(list), 8 [](std::vector<size_t> &vecToSort){ 9 sort(std::experimental::parallel::par, 10 std::begin(vecToSort), std::end(vecToSort));
  • 26. Race! 1 auto work=[](decltype(list.end()) begin,decltype(list.end()) end){ 2 for(auto it = begin; it != end; ++it) 3 std::sort(it->begin(), it->end()); 4 }; 5 size_t hc = std::thread::hardware_concurrency(); 6 if(hc == 0) hc = 8; 7 auto numThreads = std::min(list.size(), hc); 8 auto chunkPerThread = list.size() / numThreads; 9 auto threadBegin = list.begin(); 10 auto threadEnd = threadBegin; 11 std::advance(threadEnd, chunkPerThread); 12 std::list<std::future<void>> futures; 13 for(size_t thId = 0; thId < numThreads - 1; ++thId){ 14 futures.push_back(std::async(std::launch::async, 15 work, threadBegin, threadEnd)); 16 threadBegin = threadEnd; 17 std::advance(threadEnd, chunkPerThread); 18 } 19 work(threadBegin, list.end()); 20 for(auto &f : futures) f.get();
  • 27. 仗仂弍亠亟亳亠仍亠仄 舒仍... [2 亳亰亳亠从亳, 4 h-threading 磲舒] 丐亠 #2 亠舒仍亳亰舒亳 仂仍亳亳从舒 丕从仂亠仆亳亠 仂仍亳亠于仂 仂从 Parallel STL par/par 2.5 2 mine async/seq 2.5 20
  • 28. 亳仆舒仄亳亠从亳亠 仗仂仍亳亳从亳 1 std::experimental::parallel::execution_policy outerPolicy = 2 std::experimental::parallel::seq; 3 std::experimental::parallel::execution_policy innerPolicy = 4 std::experimental::parallel::par; 5 6 /* Decide at runtime which policy should be */ 7 outerPolicy = std::experimental::parallel::par; 8 innerPolicy = std::experimental::parallel::par_vec; 9 10 for_each(outerPolicy, 11 std::begin(list), std::end(list), 12 [&innerPolicy](std::vector<size_t> &vecToSort){ 13 sort(innerPolicy, 14 std::begin(vecToSort), 15 std::end(vecToSort)); 16 });
  • 29. 仍亳 仂-仂 仗仂仍仂 仆亠 舒从 1 struct Processor 2 { 3 void doWork(size_t id) { 4 throw std::runtime_error("`o卒o_ from " + std::to_string(id)); 5 } 6 }; 7 8 std::vector<Processor> processors; 9 processors.resize(25); 10 11 try { 12 std::cout << "Plain for" << std::endl; 13 std::for_each(processors.begin(), processors.end(), 14 [&](Processor &p){ 15 p.doWork(&p - processors.data()); 16 }); 17 } 18 catch(std::exception &e) { 19 std::cout << e.what() << std::endl; 20 }
  • 30. 仂于亳仄 亳从仍ム亠仆亳 1 try { 2 std::cout << "Seq for" << std::endl; 3 hpx::parallel::for_each(hpx::parallel::seq, 4 processors.begin(), processors.end(), 5 [&](Processor &p){ 6 p.doWork(&p - processors.data()); 7 }); 8 } 9 catch(hpx::parallel::exception_list &list) { 10 std::cout << "Exception list what: " << list.what() << std::endl; 11 std::cout << "Total " << list.size() << " exceptions:" << std:: endl; 12 for(auto &e : list) { 13 try{ boost::rethrow_exception(e); } 14 catch(std::exception &e){ 15 std::cout << "twhat: " << e.what() << std::endl; 16 } 17 } 18 } 19 catch(std::exception &e){ 20 std::cout << e.what() << std::endl; 21 }
  • 31. 仂于亳仄 亳从仍ム亠仆亳 Plain for `o_卒o from 0 Seq for Exception list what: HPX(unknown_error) Total 1 exceptions: what: HPX(unknown_error) Par for Exception list what: HPX(unknown_error) Total 13 exceptions: what: `o_卒o from 0 what: `o_卒o from 2 what: `o_卒o from 4 what: `o_卒o from 6 what: `o_卒o from 8 what: `o_卒o from 10 what: `o_卒o from 12 what: `o_卒o from 14 what: `o_卒o from 16 what: `o_卒o from 18 what: `o_卒o from 20 what: `o_卒o from 22 what: `o_卒o from 24
  • 32. 舒 亟亠亠 Parallelism Extension for STL 亠亠 仆亠 亠舒仍亳亰仂于舒仆仂 于 从仂仄仗亳仍仂舒. 1 #include <algorithm> 2 3 std::some_standard_algorythm_with_stl_containers( 4 std::begin(container), 5 std::end(container) 6 ); 仂 亠仍亳 亳仗仂仍亰亠 gcc, 仂...
  • 33. 舒 亟亠亠 Parallelism Extension for STL 亠亠 仆亠 亠舒仍亳亰仂于舒仆仂 于 从仂仄仗亳仍仂舒. 1 #include <algorithm> 2 3 std::some_standard_algorythm_with_stl_containers( 4 std::begin(container), 5 std::end(container) 6 ); 仂 亠仍亳 亳仗仂仍亰亠 gcc, 仂... 1 //OpenMP should be enabled 2 3 #include <parallel/algorithm> 4 5 std::__parallel::some_standard_algorythm_with_stl_containers( 6 std::begin(container), 7 std::end(container) 8 );
  • 34. 丐亠 亢亠 舒仄亠 仗亳仄亠 1 std::__parallel::sort(std::begin(vecToSort), std::end(vecToSort)); 2 3 std::__parallel::for_each(std::begin(list), std::end(list), 4 [](std::vector<size_t> &vecToSort){ 5 std::__parallel::sort(std::begin(vecToSort), std::end( vecToSort)); 6 }); 7 8 #pragma omp parallel 9 { 10 #pragma omp single 11 { 12 for(auto it = list.begin(); it != list.end(); ++it) 13 #pragma omp task 14 sort(it->begin(), it->end()); 15 } 16 }
  • 35. 亠亰仍舒 [2 亳亰亳亠从亳, 4 h-threading 磲舒] 丐亠 #2 亠舒仍亳亰舒亳 仂仍亳亳从舒 丕从仂亠仆亳亠 仂仍亳亠于仂 仂从 Parallel STL par/par 2.5 2 mine (std::async) async/seq 2.5 20 Parallel gcc par/par 2.5 2 mine (openmp) task/seq 2.5 9