Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(501)

Side by Side Diff: tools/pnacl-llc/ThreadedFunctionQueue.h

Issue 196793026: Add self-scheduling to threaded translation (vs static) (Closed) Base URL: http://git.chromium.org/native_client/pnacl-llvm.git@master
Patch Set: lower chunk size just in case Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | tools/pnacl-llc/pnacl-llc.cpp » ('j') | tools/pnacl-llc/pnacl-llc.cpp » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 //===- ThreadedFunctionQueue.h - Function work units for threads -*- C++ -*-==//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef THREADEDFUNCTIONQUEUE_H
11 #define THREADEDFUNCTIONQUEUE_H
12
13 #include "llvm/IR/Module.h"
14
15 // A "queue" that keeps track of which functions have been assigned to
16 // threads and which functions have not yet been assigned. It does not
17 // actually use a queue data structure and instead uses a number which
18 // tracks the minimum unassigned function ID, expecting each thread
19 // to have the same view of function IDs.
20 class ThreadedFunctionQueue {
21 public:
22 ThreadedFunctionQueue(Module *mod, unsigned SplitModuleCount)
23 : SplitModuleCount(SplitModuleCount),
24 NumFunctions(0),
25 CurrentFunction(0) {
26 // This is only the approximate number of functions.
27 // Some additional declarations will be added by other passes:
28 // AddPNaClExternalDeclsPass (for setjmp/longjmp and nacl variants),
29 // and the NaCl Atomics pass adds declarations of NaCl atomic intrinsics.
30 NumFunctions = mod->getFunctionList().size();
31 }
32 ~ThreadedFunctionQueue() {}
33
34 // Assign functions in a static manner between threads.
35 bool GrabFunctionStatic(unsigned FuncIndex, unsigned ThreadIndex) const {
36 return FuncIndex % SplitModuleCount == ThreadIndex;
37 }
38
39 // Assign functions between threads dynamically.
40 // Returns true if FuncIndex is unassigned and the calling thread
41 // is assigned functions [FuncIndex, FuncIndex + ChunkSize).
42 // Returns false if the calling thread is not assigned functions
43 // [FuncIndex, FuncIndex + ChunkSize).
44 //
45 // NextIndex will be set to the next unassigned function ID, so that
46 // the calling thread will know which function ID to attempt to grab
47 // next. Each thread may have a different value for the ideal ChunkSize
48 // so it is hard to predict the next available function solely based
49 // on incrementing by ChunkSize.
50 bool GrabFunctionDynamic(unsigned FuncIndex, unsigned ChunkSize,
51 unsigned &NextIndex) {
52 unsigned Cur = CurrentFunction;
53 if (FuncIndex < Cur) {
54 NextIndex = Cur;
55 return false;
56 }
57 NextIndex = Cur + ChunkSize;
58 return __sync_bool_compare_and_swap(&CurrentFunction, Cur, NextIndex);
59 }
60
61 // Returns a recommended ChunkSize for use in calling GrabFunctionDynamic().
62 // ChunkSize starts out "large" to reduce synchronization cost. However,
63 // it cannot be too large, otherwise it will encompass too many bytes
64 // and defeats streaming translation. Assigning too many functions to
65 // a single thread also throws off load balancing, so the ChunkSize is
66 // reduced when the remaining number of functions is low so that
67 // load balancing can be achieved near the end.
68 unsigned RecommendedChunkSize() {
Jim Stichnoth 2014/03/18 20:49:49 declare as const
jvoung (off chromium) 2014/03/18 22:01:17 Done.
69 // Since NumFunctions may be less than the actual number of functions
70 // (see note in ctor), clamp remaining functions to 1.
71 unsigned ApproxRemainingFuncs =
72 std::max((int)(NumFunctions - CurrentFunction), 1);
73 unsigned DynamicChunkSize = ApproxRemainingFuncs / (SplitModuleCount * 4);
74 if (DynamicChunkSize > 8U)
75 return 8U;
76 else
77 return std::max(1U, DynamicChunkSize);
78 }
79
80 private:
81 unsigned SplitModuleCount;
Jim Stichnoth 2014/03/18 20:49:49 Make SplitModuleCount and NumFunctions const?
jvoung (off chromium) 2014/03/18 22:01:17 Done.
82 unsigned NumFunctions;
83 volatile unsigned CurrentFunction;
84 };
85
86 #endif
OLDNEW
« no previous file with comments | « no previous file | tools/pnacl-llc/pnacl-llc.cpp » ('j') | tools/pnacl-llc/pnacl-llc.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698