From 791979187be1f2ad1b10ac8e5adcfd59a8ff9251 Mon Sep 17 00:00:00 2001 From: Anmol Sahoo Date: Sat, 22 May 2021 17:59:17 -0400 Subject: [PATCH] updated multicore lockfree --- benchmarks/multicore-lockfree/ctrie-dune.inc | 16 -- benchmarks/multicore-lockfree/ctrie.ml | 117 -------------- .../multicore-lockfree/ctrie_parallel.ml | 148 ++++++++++++++++++ .../multicore-lockfree/ctrie_sequential.ml | 148 ++++++++++++++++++ benchmarks/multicore-lockfree/dune | 45 +++++- .../{test_hash.ml => hash_parallel.ml} | 0 .../multicore-lockfree/hash_sequential.ml | 25 +++ benchmarks/multicore-lockfree/test_ctrie.ml | 27 ---- .../test_ctrie_sequential.ml | 25 --- .../{test_wsqueue.ml => wsqueue_parallel.ml} | 0 .../multicore-lockfree/wsqueue_sequential.ml | 36 +++++ multicore_parallel_run_config.json | 49 ++++-- 12 files changed, 432 insertions(+), 204 deletions(-) delete mode 100644 benchmarks/multicore-lockfree/ctrie-dune.inc delete mode 100644 benchmarks/multicore-lockfree/ctrie.ml create mode 100644 benchmarks/multicore-lockfree/ctrie_parallel.ml create mode 100644 benchmarks/multicore-lockfree/ctrie_sequential.ml rename benchmarks/multicore-lockfree/{test_hash.ml => hash_parallel.ml} (100%) create mode 100644 benchmarks/multicore-lockfree/hash_sequential.ml delete mode 100644 benchmarks/multicore-lockfree/test_ctrie.ml delete mode 100644 benchmarks/multicore-lockfree/test_ctrie_sequential.ml rename benchmarks/multicore-lockfree/{test_wsqueue.ml => wsqueue_parallel.ml} (100%) create mode 100644 benchmarks/multicore-lockfree/wsqueue_sequential.ml diff --git a/benchmarks/multicore-lockfree/ctrie-dune.inc b/benchmarks/multicore-lockfree/ctrie-dune.inc deleted file mode 100644 index 27154ba622..0000000000 --- a/benchmarks/multicore-lockfree/ctrie-dune.inc +++ /dev/null @@ -1,16 +0,0 @@ -(library - (name ctrie) - (modules ctrie) - (libraries base)) - -(executable - (name test_ctrie) - (modules test_ctrie) - (libraries ctrie)) - -(executable - (name test_ctrie_sequential) - (modules test_ctrie_sequential) - (libraries ctrie)) - -(alias (name multibench_parallel) (deps test_ctrie.exe test_ctrie_sequential.exe)) diff --git a/benchmarks/multicore-lockfree/ctrie.ml b/benchmarks/multicore-lockfree/ctrie.ml deleted file mode 100644 index e4123429f3..0000000000 --- a/benchmarks/multicore-lockfree/ctrie.ml +++ /dev/null @@ -1,117 +0,0 @@ -(* Concurrent, hash array mapped trie based on - - Prokopec, A. et al. (2011) - Cache-Aware Lock-Free Concurrent Hash Tries. Technical Report, 2011. *) - -(* configuration parameters *) -let shift = 5 - -(* data definition *) -type node = - | Empty - | Cnode of { map : int ; nodes : (node Atomic.t) array } - | Inode of { key : int ; values : int list ; delete : bool } - -type t = node Atomic.t - -(* helper functions *) - -(* detect flag of key in map *) -let flag k l _map = - let i = - (k lsr (l * shift)) - land - ((1 lsl shift) - 1) in - i - -(* check if flag is set *) -let set i map = - ((1 lsl i) land map) <> 0 - -(* detect position in array *) -let pos flag map = - (Base.Int.popcount (((1 lsl flag) - 1) land map)) - -(* create empty map *) -let empty () = Atomic.make Empty - -(* insert key and value binding into map *) -let rec insert_aux k v l t = - match Atomic.get t with - | Empty -> - let i = flag k l 0 in - let map = 1 lsl i in - let nodes = [| - (Atomic.make (Inode {key = k ; values = [v] ; delete = false})) - |] in - let new_node = Cnode { map ; nodes } in - Atomic.compare_and_set t Empty new_node - | Cnode { map ; nodes } as c -> - let i = flag k l map in - if (set i map) then begin - let p = pos i map in - insert_aux k v (l+1) nodes.(p) - end else begin - let map = (1 lsl i) lor (map) in - let p = pos i map in - let old_len = Array.length nodes in - let new_nodes = Array.init (old_len + 1) (fun i -> - if i < p then nodes.(i) else - if i = p then - Atomic.make (Inode {key = k; values = [v] ; delete = false}) - else - nodes.(i-1)) in - let new_node = Cnode { map ; nodes = new_nodes } in - Atomic.compare_and_set t c new_node - end - | Inode { key ; values ; delete} as inode -> - if key = k then begin - let new_values = v :: values in - let new_node = Inode { key ; values = new_values ; delete } in - Atomic.compare_and_set t inode new_node - end else begin - let i = flag key l 0 in - let ni = flag k l 0 in - let map = (1 lsl i) lor 0 in - let map = (1 lsl ni) lor map in - let nodes = - if (ni > i) then - ([| - Atomic.make (Inode { key ; values ; delete }) ; - Atomic.make (Inode { key = k ; values = [v] ; delete = false }) - |], true) - else if (ni < i) then - ([| - Atomic.make (Inode { key = k ; values = [v] ; delete = false }) ; - Atomic.make (Inode { key ; values ; delete }) - |], true) - else begin - let i = flag key (l+1) 0 in - let nmap = (1 lsl i) lor 0 in - let nnodes = [|Atomic.make (Inode {key ; values; delete})|] in - ([| - Atomic.make (Cnode { map = nmap ; nodes = nnodes }) - |], false) - end in - let (nodes, new_level) = nodes in - let new_node = Cnode { map ; nodes } in - Atomic.compare_and_set t inode new_node && new_level - end - -let rec insert k v t = - if insert_aux k v 0 t then () else insert k v t - -(* check if key in map *) -let rec mem k l t = - match Atomic.get t with - | Empty -> false - | Cnode { map ; nodes } -> - let f = flag k l map in - if (set f map) then begin - let p = pos f map in - mem k (l+1) nodes.(p) - end else begin - false - end - | Inode { key ; _ } -> if key = k then true else false - -let mem k t = mem k 0 t diff --git a/benchmarks/multicore-lockfree/ctrie_parallel.ml b/benchmarks/multicore-lockfree/ctrie_parallel.ml new file mode 100644 index 0000000000..7d2ee4da99 --- /dev/null +++ b/benchmarks/multicore-lockfree/ctrie_parallel.ml @@ -0,0 +1,148 @@ +module Ctrie = struct + (* Concurrent, hash array mapped trie based on - + Prokopec, A. et al. (2011) + Cache-Aware Lock-Free Concurrent Hash Tries. Technical Report, 2011. *) + + (* configuration parameters *) + let shift = 5 + + (* data definition *) + type node = + | Empty + | Cnode of { map : int ; nodes : (node Atomic.t) array } + | Inode of { key : int ; values : int list ; delete : bool } + + type t = node Atomic.t + + (* helper functions *) + + (* detect flag of key in map *) + let flag k l _map = + let i = + (k lsr (l * shift)) + land + ((1 lsl shift) - 1) in + i + + (* check if flag is set *) + let set i map = + ((1 lsl i) land map) <> 0 + + (* detect position in array *) + let pos flag map = + (Base.Int.popcount (((1 lsl flag) - 1) land map)) + + (* create empty map *) + let empty () = Atomic.make Empty + + (* insert key and value binding into map *) + let rec insert_aux k v l t = + match Atomic.get t with + | Empty -> + let i = flag k l 0 in + let map = 1 lsl i in + let nodes = [| + (Atomic.make (Inode {key = k ; values = [v] ; delete = false})) + |] in + let new_node = Cnode { map ; nodes } in + Atomic.compare_and_set t Empty new_node + | Cnode { map ; nodes } as c -> + let i = flag k l map in + if (set i map) then begin + let p = pos i map in + insert_aux k v (l+1) nodes.(p) + end else begin + let map = (1 lsl i) lor (map) in + let p = pos i map in + let old_len = Array.length nodes in + let new_nodes = Array.init (old_len + 1) (fun i -> + if i < p then nodes.(i) else + if i = p then + Atomic.make (Inode {key = k; values = [v] ; delete = false}) + else + nodes.(i-1)) in + let new_node = Cnode { map ; nodes = new_nodes } in + Atomic.compare_and_set t c new_node + end + | Inode { key ; values ; delete} as inode -> + if key = k then begin + let new_values = v :: values in + let new_node = Inode { key ; values = new_values ; delete } in + Atomic.compare_and_set t inode new_node + end else begin + let i = flag key l 0 in + let ni = flag k l 0 in + let map = (1 lsl i) lor 0 in + let map = (1 lsl ni) lor map in + let nodes = + if (ni > i) then + ([| + Atomic.make (Inode { key ; values ; delete }) ; + Atomic.make (Inode { key = k ; values = [v] ; delete = false }) + |], true) + else if (ni < i) then + ([| + Atomic.make (Inode { key = k ; values = [v] ; delete = false }) ; + Atomic.make (Inode { key ; values ; delete }) + |], true) + else begin + let i = flag key (l+1) 0 in + let nmap = (1 lsl i) lor 0 in + let nnodes = [|Atomic.make (Inode {key ; values; delete})|] in + ([| + Atomic.make (Cnode { map = nmap ; nodes = nnodes }) + |], false) + end in + let (nodes, new_level) = nodes in + let new_node = Cnode { map ; nodes } in + Atomic.compare_and_set t inode new_node && new_level + end + + let rec insert k v t = + if insert_aux k v 0 t then () else insert k v t + + (* check if key in map *) + let rec mem k l t = + match Atomic.get t with + | Empty -> false + | Cnode { map ; nodes } -> + let f = flag k l map in + if (set f map) then begin + let p = pos f map in + mem k (l+1) nodes.(p) + end else begin + false + end + | Inode { key ; _ } -> if key = k then true else false + + let mem k t = mem k 0 t +end + +module T = Domainslib.Task + +let num_domains = try int_of_string Sys.argv.(1) with _ -> 4 +let num_elems = try int_of_string Sys.argv.(2) with _ -> 1000000 +let ins_ratio = try float_of_string Sys.argv.(3) with _ -> 0.5 + +let state_key = Domain.DLS.new_key Random.State.make_self_init in + +let rand_int () = + let state = Domain.DLS.get state_key in + Random.State.int state 10000 + +let rand_float () = + let state = Domain.DLS.get state_key in + Random.State.float state 1.0 + +let work tree int = + if rand_float () > ins_ratio then + ignore (Ctrie.mem (rand_int ()) tree) + else + ignore (Ctrie.insert (rand_int ()) 0 tree) + +let _ = + let pool = T.setup_pool num_domains in + let tree = Ctrie.empty () in + let work = work tree in + T.parallel_for ~start:0 ~finish:(num_elems - 1) ~body:work pool; + T.teardown_pool pool diff --git a/benchmarks/multicore-lockfree/ctrie_sequential.ml b/benchmarks/multicore-lockfree/ctrie_sequential.ml new file mode 100644 index 0000000000..7d2ee4da99 --- /dev/null +++ b/benchmarks/multicore-lockfree/ctrie_sequential.ml @@ -0,0 +1,148 @@ +module Ctrie = struct + (* Concurrent, hash array mapped trie based on - + Prokopec, A. et al. (2011) + Cache-Aware Lock-Free Concurrent Hash Tries. Technical Report, 2011. *) + + (* configuration parameters *) + let shift = 5 + + (* data definition *) + type node = + | Empty + | Cnode of { map : int ; nodes : (node Atomic.t) array } + | Inode of { key : int ; values : int list ; delete : bool } + + type t = node Atomic.t + + (* helper functions *) + + (* detect flag of key in map *) + let flag k l _map = + let i = + (k lsr (l * shift)) + land + ((1 lsl shift) - 1) in + i + + (* check if flag is set *) + let set i map = + ((1 lsl i) land map) <> 0 + + (* detect position in array *) + let pos flag map = + (Base.Int.popcount (((1 lsl flag) - 1) land map)) + + (* create empty map *) + let empty () = Atomic.make Empty + + (* insert key and value binding into map *) + let rec insert_aux k v l t = + match Atomic.get t with + | Empty -> + let i = flag k l 0 in + let map = 1 lsl i in + let nodes = [| + (Atomic.make (Inode {key = k ; values = [v] ; delete = false})) + |] in + let new_node = Cnode { map ; nodes } in + Atomic.compare_and_set t Empty new_node + | Cnode { map ; nodes } as c -> + let i = flag k l map in + if (set i map) then begin + let p = pos i map in + insert_aux k v (l+1) nodes.(p) + end else begin + let map = (1 lsl i) lor (map) in + let p = pos i map in + let old_len = Array.length nodes in + let new_nodes = Array.init (old_len + 1) (fun i -> + if i < p then nodes.(i) else + if i = p then + Atomic.make (Inode {key = k; values = [v] ; delete = false}) + else + nodes.(i-1)) in + let new_node = Cnode { map ; nodes = new_nodes } in + Atomic.compare_and_set t c new_node + end + | Inode { key ; values ; delete} as inode -> + if key = k then begin + let new_values = v :: values in + let new_node = Inode { key ; values = new_values ; delete } in + Atomic.compare_and_set t inode new_node + end else begin + let i = flag key l 0 in + let ni = flag k l 0 in + let map = (1 lsl i) lor 0 in + let map = (1 lsl ni) lor map in + let nodes = + if (ni > i) then + ([| + Atomic.make (Inode { key ; values ; delete }) ; + Atomic.make (Inode { key = k ; values = [v] ; delete = false }) + |], true) + else if (ni < i) then + ([| + Atomic.make (Inode { key = k ; values = [v] ; delete = false }) ; + Atomic.make (Inode { key ; values ; delete }) + |], true) + else begin + let i = flag key (l+1) 0 in + let nmap = (1 lsl i) lor 0 in + let nnodes = [|Atomic.make (Inode {key ; values; delete})|] in + ([| + Atomic.make (Cnode { map = nmap ; nodes = nnodes }) + |], false) + end in + let (nodes, new_level) = nodes in + let new_node = Cnode { map ; nodes } in + Atomic.compare_and_set t inode new_node && new_level + end + + let rec insert k v t = + if insert_aux k v 0 t then () else insert k v t + + (* check if key in map *) + let rec mem k l t = + match Atomic.get t with + | Empty -> false + | Cnode { map ; nodes } -> + let f = flag k l map in + if (set f map) then begin + let p = pos f map in + mem k (l+1) nodes.(p) + end else begin + false + end + | Inode { key ; _ } -> if key = k then true else false + + let mem k t = mem k 0 t +end + +module T = Domainslib.Task + +let num_domains = try int_of_string Sys.argv.(1) with _ -> 4 +let num_elems = try int_of_string Sys.argv.(2) with _ -> 1000000 +let ins_ratio = try float_of_string Sys.argv.(3) with _ -> 0.5 + +let state_key = Domain.DLS.new_key Random.State.make_self_init in + +let rand_int () = + let state = Domain.DLS.get state_key in + Random.State.int state 10000 + +let rand_float () = + let state = Domain.DLS.get state_key in + Random.State.float state 1.0 + +let work tree int = + if rand_float () > ins_ratio then + ignore (Ctrie.mem (rand_int ()) tree) + else + ignore (Ctrie.insert (rand_int ()) 0 tree) + +let _ = + let pool = T.setup_pool num_domains in + let tree = Ctrie.empty () in + let work = work tree in + T.parallel_for ~start:0 ~finish:(num_elems - 1) ~body:work pool; + T.teardown_pool pool diff --git a/benchmarks/multicore-lockfree/dune b/benchmarks/multicore-lockfree/dune index 3921a731ac..e290ed930d 100644 --- a/benchmarks/multicore-lockfree/dune +++ b/benchmarks/multicore-lockfree/dune @@ -1,6 +1,39 @@ -(include hash-dune.inc) -(include wsqueue-dune.inc) -(include bag-dune.inc) -(include msqueue-dune.inc) -(include list-dune.inc) -(include ctrie-dune.inc) +(executable + (name hash_sequential) + (modules hash_sequential) + (libraries lockfree)) + +(executable + (name hash_parallel) + (modules hash_parallel) + (libraries lockfree)) + +(executable + (name ctrie_sequential) + (modules ctrie_seqeuntial) + (libraries domainslib)) + +(executable + (name ctrie_parallel) + (modules ctrie_parallel) + (libraries domainslib)) + +(executable + (name wsqueue_seqeuntial) + (modules wsqueue_sequential) + (libraries lockfree)) + +(executable + (name wsqueue_parallel) + (modules wsqueue_parallel) + (libraries lockfree)) + +(alias (name multibench_parallel) + (deps hash_parallel.exe + ctrie_parallel.exe + wsqueue_parallel.exe)) + +(alias (name buildbench) + (deps hash_sequential.exe + ctrie_sequential.exe + wsqueue_sequential.exe)) diff --git a/benchmarks/multicore-lockfree/test_hash.ml b/benchmarks/multicore-lockfree/hash_parallel.ml similarity index 100% rename from benchmarks/multicore-lockfree/test_hash.ml rename to benchmarks/multicore-lockfree/hash_parallel.ml diff --git a/benchmarks/multicore-lockfree/hash_sequential.ml b/benchmarks/multicore-lockfree/hash_sequential.ml new file mode 100644 index 0000000000..3ac227926f --- /dev/null +++ b/benchmarks/multicore-lockfree/hash_sequential.ml @@ -0,0 +1,25 @@ +module Hash = Lockfree.Hash + +let threads = int_of_string Sys.argv.(1) +let read_percent = int_of_string Sys.argv.(2) +let num_opers = int_of_string Sys.argv.(3) + +let () = Random.init 42 + +let h = Hash.create() + +let do_stuff_with_hash () = + for _ = 1 to num_opers do + if Random.int 100 > read_percent then + Hash.add h (Random.int 1000) 0 + else + ignore(Hash.find h (Random.int 1000)) + done + +let () = + let rec spawn_thread n = + match n with + | 0 -> [] + | _ -> (Domain.spawn do_stuff_with_hash) :: spawn_thread (n-1) + in + ignore(List.map (fun d -> Domain.join d) (spawn_thread threads)) diff --git a/benchmarks/multicore-lockfree/test_ctrie.ml b/benchmarks/multicore-lockfree/test_ctrie.ml deleted file mode 100644 index cc925e0fc9..0000000000 --- a/benchmarks/multicore-lockfree/test_ctrie.ml +++ /dev/null @@ -1,27 +0,0 @@ -let threads = int_of_string Sys.argv.(1) -let insert_percent = int_of_string Sys.argv.(2) -let num_opers = int_of_string Sys.argv.(3) / threads - -let state_key = Domain.DLS.new_key Random.State.make_self_init - -let tree = Ctrie.empty () - -let work () = - let state = Domain.DLS.get state_key in - let rand_int n = Random.State.int state n in - for _ = 1 to num_opers do - if rand_int 100 > insert_percent then - ignore (Ctrie.mem (rand_int 1000000) tree) - else - Ctrie.insert (rand_int 1000000) 0 tree - done - -let () = - let rec spawn_thread n = - match n with - | 0 -> [] - | _ -> (Domain.spawn work) :: spawn_thread (n-1) - in - let threads = spawn_thread (threads - 1) in - ignore (work ()); - ignore (List.map (fun d -> Domain.join d) threads) diff --git a/benchmarks/multicore-lockfree/test_ctrie_sequential.ml b/benchmarks/multicore-lockfree/test_ctrie_sequential.ml deleted file mode 100644 index b9da64adb1..0000000000 --- a/benchmarks/multicore-lockfree/test_ctrie_sequential.ml +++ /dev/null @@ -1,25 +0,0 @@ -let threads = 1 -let insert_percent = int_of_string Sys.argv.(1) -let num_opers = int_of_string Sys.argv.(2) - -let () = Random.init 42 - -let tree = Ctrie.empty () - -let work () = - for _ = 1 to num_opers do - if Random.int 100 > insert_percent then - ignore (Ctrie.mem (Random.int 1000000) tree) - else - Ctrie.insert (Random.int 1000000) 0 tree - done - -let () = - let rec spawn_thread n = - match n with - | 0 -> [] - | _ -> (Domain.spawn work) :: spawn_thread (n-1) - in - let threads = spawn_thread (threads - 1) in - ignore (work ()); - ignore (List.map (fun d -> Domain.join d) threads) diff --git a/benchmarks/multicore-lockfree/test_wsqueue.ml b/benchmarks/multicore-lockfree/wsqueue_parallel.ml similarity index 100% rename from benchmarks/multicore-lockfree/test_wsqueue.ml rename to benchmarks/multicore-lockfree/wsqueue_parallel.ml diff --git a/benchmarks/multicore-lockfree/wsqueue_sequential.ml b/benchmarks/multicore-lockfree/wsqueue_sequential.ml new file mode 100644 index 0000000000..55d52efd08 --- /dev/null +++ b/benchmarks/multicore-lockfree/wsqueue_sequential.ml @@ -0,0 +1,36 @@ +module WSQueue = Lockfree.WSQueue + +let num_threads = int_of_string Sys.argv.(1) +let num_items = int_of_string Sys.argv.(2) + +let () = Random.init 42 + +let loop_and_drain_queue wsq_array thread_num () = + let rec drain_queue wsq_array thread_num = + let q_num = Random.int num_threads in + let wsq = Array.get wsq_array q_num in + let item = if q_num == thread_num then + WSQueue.pop wsq + else + WSQueue.steal wsq + in match item with + | None when q_num == thread_num -> () + | _ -> drain_queue wsq_array thread_num + in drain_queue wsq_array thread_num + +let make_and_populate_wsq _ = + let q = WSQueue.create () in + for i = 1 to num_items do + WSQueue.push q i + done; q + +let () = + for _ = 1 to 32 do + let wsq_array = Array.init num_threads make_and_populate_wsq in + let rec spawn_thread n = + match n with + | -1 -> [] + | _ -> (Domain.spawn (loop_and_drain_queue wsq_array n)) :: spawn_thread (n-1) + in + ignore(List.map (fun d -> Domain.join d) (spawn_thread (num_threads-1))) + done diff --git a/multicore_parallel_run_config.json b/multicore_parallel_run_config.json index d1ec03bf7f..214d243ee3 100644 --- a/multicore_parallel_run_config.json +++ b/multicore_parallel_run_config.json @@ -475,6 +475,7 @@ ] }, { +<<<<<<< HEAD "executable": "benchmarks/multicore-lockfree/test_wsqueue.exe", "name": "test_wsqueue", "tags": ["lockfree_bench"], @@ -488,6 +489,11 @@ "executable": "benchmarks/multicore-lockfree/test_wsqueue_multicore.exe", "name": "test_wsqueue_multicore", "tags": ["lockfree_bench"], +======= + "executable": "benchmarks/multicore-lockfree/wsqueue_parallel.exe", + "name": "lockfree-wsqueue", + "tags": [], +>>>>>>> updated multicore lockfree "runs": [ { "params": "1 10_000_000", "paramwrapper": "taskset --cpu-list 2-13" @@ -557,6 +563,7 @@ ] }, { +<<<<<<< HEAD "executable": "benchmarks/multicore-lockfree/test_hash.exe", "name": "test_hash", "tags": ["lockfree_bench"], @@ -611,6 +618,11 @@ "executable": "benchmarks/multicore-lockfree/test_bag_multicore.exe", "name": "test_bag_multicore", "tags": ["lockfree_bench"], +======= + "executable": "benchmarks/multicore-lockfree/hash_parallel.exe", + "name": "lockfree-hash", + "tags": [], +>>>>>>> updated multicore lockfree "runs": [ { "params": "1 10_000_000 50", "paramwrapper": "taskset --cpu-list 2-13" @@ -680,25 +692,36 @@ ] }, { - "executable": "benchmarks/multicore-lockfree/test_ctrie_sequential.exe", + "executable": "benchmarks/multicore-lockfree/ctrie_sequential.exe", "name": "lockfree-map", - "ismacrobench": false, + "tags": [], "runs": [ - { "params": "80 1000000", "paramwrapper": "taskset --cpu-list 2-13 chrt -r 1"} + { + "params": "1 10000000 0.5" + } ] }, { - "executable": "benchmarks/multicore-lockfree/test_ctrie.exe", - "name": "lockfree-map_multicore", - "ismacrobench": false, + "executable": "benchmarks/multicore-lockfree/ctrie_parallel.exe", + "name": "lockfree-map_parallel", + "tags": [], "runs": [ - { "params": "2 80 1000000", "paramwrapper": "taskset --cpu-list 2-13 chrt -r 1"}, - { "params": "4 80 1000000", "paramwrapper": "taskset --cpu-list 2-13 chrt -r 1" }, - { "params": "8 80 1000000", "paramwrapper": "taskset --cpu-list 2-13 chrt -r 1" }, - { "params": "12 80 1000000", "paramwrapper": "taskset --cpu-list 2-13 chrt -r 1" }, - { "params": "16 80 1000000", "paramwrapper": "taskset --cpu-list 2-13,16-27 chrt -r 1" }, - { "params": "20 80 1000000", "paramwrapper": "taskset --cpu-list 2-13,16-27 chrt -r 1" }, - { "params": "24 80 1000000", "paramwrapper": "taskset --cpu-list 2-13,16-27 chrt -r 1" } + {"params": "1 1000000 0.5"}, + {"params": "2 1000000 0.5"}, + {"params": "4 1000000 0.5"}, + {"params": "8 1000000 0.5"}, + {"params": "12 1000000 0.5"}, + {"params": "16 1000000 0.5"}, + {"params": "20 1000000 0.5"}, + {"params": "24 1000000 0.5"}, + {"params": "28 1000000 0.5"}, + {"params": "32 1000000 0.5"}, + {"params": "36 1000000 0.5"}, + {"params": "40 1000000 0.5"}, + {"params": "44 1000000 0.5"}, + {"params": "48 1000000 0.5"}, + {"params": "52 1000000 0.5"}, + {"params": "56 1000000 0.5"} ] }, {