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

Side by Side Diff: src/wasm/wasm-module.cc

Issue 2718053002: [wasm] Minor optimization for parallel compilation (Closed)
Patch Set: Created 3 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 | « src/flag-definitions.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <memory> 5 #include <memory>
6 6
7 #include "src/assembler-inl.h" 7 #include "src/assembler-inl.h"
8 #include "src/base/adapters.h" 8 #include "src/base/adapters.h"
9 #include "src/base/atomic-utils.h" 9 #include "src/base/atomic-utils.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 DisallowHandleDereference no_deref; 239 DisallowHandleDereference no_deref;
240 DisallowCodeDependencyChange no_dependency_change; 240 DisallowCodeDependencyChange no_dependency_change;
241 241
242 // - 1 because AtomicIncrement returns the value after the atomic increment. 242 // - 1 because AtomicIncrement returns the value after the atomic increment.
243 size_t index = next_unit_.Increment(1) - 1; 243 size_t index = next_unit_.Increment(1) - 1;
244 if (index >= compilation_units_.size()) { 244 if (index >= compilation_units_.size()) {
245 return false; 245 return false;
246 } 246 }
247 247
248 compiler::WasmCompilationUnit* unit = compilation_units_.at(index); 248 compiler::WasmCompilationUnit* unit = compilation_units_.at(index);
249 if (unit != nullptr) { 249 unit->ExecuteCompilation();
250 unit->ExecuteCompilation(); 250 base::LockGuard<base::Mutex> guard(&result_mutex_);
251 base::LockGuard<base::Mutex> guard(&result_mutex_); 251 executed_units_.push(unit);
252 executed_units_.push(unit);
253 }
254 return true; 252 return true;
255 } 253 }
256 254
257 void InitializeParallelCompilation(const std::vector<WasmFunction>& functions, 255 void InitializeParallelCompilation(const std::vector<WasmFunction>& functions,
258 ModuleBytesEnv& module_env, 256 ModuleBytesEnv& module_env,
259 ErrorThrower* thrower) { 257 ErrorThrower* thrower) {
260 compilation_units_.reserve(functions.size()); 258 uint32_t start = module_env.module_env.module->num_imported_functions +
261 for (uint32_t i = FLAG_skip_compiling_wasm_funcs; i < functions.size(); 259 FLAG_skip_compiling_wasm_funcs;
262 ++i) { 260 uint32_t num_funcs = static_cast<uint32_t>(functions.size());
261 uint32_t funcs_to_compile = start > num_funcs ? 0 : num_funcs - start;
262 compilation_units_.reserve(funcs_to_compile);
263 for (uint32_t i = start; i < num_funcs; ++i) {
263 const WasmFunction* func = &functions[i]; 264 const WasmFunction* func = &functions[i];
264 compilation_units_.push_back( 265 compilation_units_.push_back(new compiler::WasmCompilationUnit(
265 func->imported ? nullptr 266 thrower, isolate_, &module_env, func, i));
266 : new compiler::WasmCompilationUnit(
267 thrower, isolate_, &module_env, func, i));
268 } 267 }
269 } 268 }
270 269
271 uint32_t* StartCompilationTasks() { 270 uint32_t* StartCompilationTasks() {
272 const size_t num_tasks = 271 const size_t num_tasks =
273 Min(static_cast<size_t>(FLAG_wasm_num_compilation_tasks), 272 Min(static_cast<size_t>(FLAG_wasm_num_compilation_tasks),
274 V8::GetCurrentPlatform()->NumberOfAvailableBackgroundThreads()); 273 V8::GetCurrentPlatform()->NumberOfAvailableBackgroundThreads());
275 uint32_t* task_ids = new uint32_t[num_tasks]; 274 uint32_t* task_ids = new uint32_t[num_tasks];
276 for (size_t i = 0; i < num_tasks; ++i) { 275 for (size_t i = 0; i < num_tasks; ++i) {
277 CompilationTask* task = new CompilationTask(this); 276 CompilationTask* task = new CompilationTask(this);
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 // patched at instantiation. 441 // patched at instantiation.
443 Handle<Code> illegal_builtin = isolate_->builtins()->Illegal(); 442 Handle<Code> illegal_builtin = isolate_->builtins()->Illegal();
444 for (uint32_t i = 0; i < module_->functions.size(); ++i) { 443 for (uint32_t i = 0; i < module_->functions.size(); ++i) {
445 code_table->set(static_cast<int>(i), *illegal_builtin); 444 code_table->set(static_cast<int>(i), *illegal_builtin);
446 temp_instance.function_code[i] = illegal_builtin; 445 temp_instance.function_code[i] = illegal_builtin;
447 } 446 }
448 447
449 isolate_->counters()->wasm_functions_per_module()->AddSample( 448 isolate_->counters()->wasm_functions_per_module()->AddSample(
450 static_cast<int>(module_->functions.size())); 449 static_cast<int>(module_->functions.size()));
451 CompilationHelper helper(isolate_, module_); 450 CompilationHelper helper(isolate_, module_);
452 if (!FLAG_trace_wasm_decoder && FLAG_wasm_num_compilation_tasks != 0) { 451 size_t funcs_to_compile =
452 module_->functions.size() - module_->num_imported_functions;
453 if (!FLAG_trace_wasm_decoder && FLAG_wasm_num_compilation_tasks != 0 &&
454 funcs_to_compile > 1) {
453 // Avoid a race condition by collecting results into a second vector. 455 // Avoid a race condition by collecting results into a second vector.
454 std::vector<Handle<Code>> results(temp_instance.function_code); 456 std::vector<Handle<Code>> results(temp_instance.function_code);
455 helper.CompileInParallel(&module_env, results, thrower); 457 helper.CompileInParallel(&module_env, results, thrower);
456 temp_instance.function_code.swap(results); 458 temp_instance.function_code.swap(results);
457 } else { 459 } else {
458 helper.CompileSequentially(&module_env, temp_instance.function_code, 460 helper.CompileSequentially(&module_env, temp_instance.function_code,
459 thrower); 461 thrower);
460 } 462 }
461 if (thrower->error()) return {}; 463 if (thrower->error()) return {};
462 464
(...skipping 2245 matching lines...) Expand 10 before | Expand all | Expand 10 after
2708 Handle<String> module_property_name = 2710 Handle<String> module_property_name =
2709 isolate->factory()->InternalizeUtf8String("module"); 2711 isolate->factory()->InternalizeUtf8String("module");
2710 Handle<String> instance_property_name = 2712 Handle<String> instance_property_name =
2711 isolate->factory()->InternalizeUtf8String("instance"); 2713 isolate->factory()->InternalizeUtf8String("instance");
2712 JSObject::AddProperty(ret, module_property_name, module, NONE); 2714 JSObject::AddProperty(ret, module_property_name, module, NONE);
2713 JSObject::AddProperty(ret, instance_property_name, 2715 JSObject::AddProperty(ret, instance_property_name,
2714 instance_object.ToHandleChecked(), NONE); 2716 instance_object.ToHandleChecked(), NONE);
2715 2717
2716 ResolvePromise(isolate, promise, ret); 2718 ResolvePromise(isolate, promise, ret);
2717 } 2719 }
OLDNEW
« no previous file with comments | « src/flag-definitions.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698