Skip to content

Commit 73e702b

Browse files
hawkinspGoogle-ML-Automation
authored andcommitted
[XLA:CPU] Consistently initialize the LLVM native target.
Fixes the following TSAN race: ``` WARNING: ThreadSanitizer: data race (pid=899472) Write of size 8 at 0x7f979e0f1cd8 by thread T69: #0 llvm::TargetRegistry::RegisterTargetMachine(llvm::Target&, llvm::TargetMachine* (*)(llvm::Target const&, llvm::Triple const&, llvm::StringRef, llvm::StringRef, llvm::TargetOptions const&, std::optional<llvm::Reloc::Model>, std::optional<llvm::CodeModel::Model>, llvm::CodeGenOptLevel, bool)) /proc/self/cwd/external/llvm-project/llvm/include/llvm/MC/TargetRegistry.h:827:27 (xla_extension.so+0x9803668) (BuildId: 6fa88e3910a5eb04) #1 llvm::RegisterTargetMachine<llvm::X86TargetMachine>::RegisterTargetMachine(llvm::Target&) /proc/self/cwd/external/llvm-project/llvm/include/llvm/MC/TargetRegistry.h:1250:5 (xla_extension.so+0x9803668) #2 LLVMInitializeX86Target /proc/self/cwd/external/llvm-project/llvm/lib/Target/X86/X86TargetMachine.cpp:69:43 (xla_extension.so+0x9803668) #3 llvm::InitializeNativeTarget() /proc/self/cwd/external/llvm-project/llvm/include/llvm/Support/TargetSelect.h:123:5 (xla_extension.so+0x48d2358) (BuildId: 6fa88e3910a5eb04) #4 xla::cpu::JitCompiler::Create(llvm::TargetOptions, xla::cpu::JitCompiler::Options, absl::lts_20230802::AnyInvocable<void (std::function<void ()>)>)::$_0::operator()() const /proc/self/cwd/external/xla/xla/backends/cpu/codegen/jit_compiler.cc:113:5 (xla_extension.so+0x48d2358) openxla#5 xla::cpu::JitCompiler::Create(llvm::TargetOptions, xla::cpu::JitCompiler::Options, absl::lts_20230802::AnyInvocable<void (std::function<void ()>)>) /proc/self/cwd/external/xla/xla/backends/cpu/codegen/jit_compiler.cc:112:34 (xla_extension.so+0x48d209b) (BuildId: 6fa88e3910a5eb04) openxla#6 xla::cpu::CpuCompiler::CompileLegacyCpuExecutable(std::unique_ptr<xla::HloModule, std::default_delete<xla::HloModule>>) /proc/self/cwd/external/xla/xla/service/cpu/cpu_compiler.cc:1416:3 (xla_extension.so+0x2f716a0) (BuildId: 6fa88e3910a5eb04) openxla#7 xla::cpu::CpuCompiler::RunBackend(std::unique_ptr<xla::HloModule, std::default_delete<xla::HloModule>>, stream_executor::StreamExecutor*, xla::Compiler::CompileOptions const&) /proc/self/cwd/external/xla/xla/service/cpu/cpu_compiler.cc:1730:3 (xla_extension.so+0x2f7ae18) (BuildId: 6fa88e3910a5eb04) openxla#8 xla::JitCompile(xla::XlaComputation const&, absl::lts_20230802::Span<xla::Shape const* const>, xla::ExecutableBuildOptions const&, xla::ExecutionOptions const&, xla::Compiler::CompileOptions const&, int, std::function<void (xla::HloModuleConfig&)>) /proc/self/cwd/external/xla/xla/pjrt/cpu/cpu_client.cc:759:19 (xla_extension.so+0x2f12915) (BuildId: 6fa88e3910a5eb04) openxla#9 xla::TfrtCpuClient::Compile(xla::XlaComputation const&, xla::CompileOptions) /proc/self/cwd/external/xla/xla/pjrt/cpu/cpu_client.cc:847:3 (xla_extension.so+0x2f12915) Previous read of size 8 at 0x7f979e0f1cd8 by thread T66: #0 llvm::Target::createTargetMachine(llvm::StringRef, llvm::StringRef, llvm::StringRef, llvm::TargetOptions const&, std::optional<llvm::Reloc::Model>, std::optional<llvm::CodeModel::Model>, llvm::CodeGenOptLevel, bool) const /proc/self/cwd/external/llvm-project/llvm/include/llvm/MC/TargetRegistry.h:460:10 (xla_extension.so+0x94ba6db) (BuildId: 6fa88e3910a5eb04) #1 llvm::EngineBuilder::selectTarget(llvm::Triple const&, llvm::StringRef, llvm::StringRef, llvm::SmallVectorImpl<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>> const&) /proc/self/cwd/external/llvm-project/llvm/lib/ExecutionEngine/TargetSelect.cpp:88:18 (xla_extension.so+0x94ba6db) #2 xla::cpu::JitCompiler::InferTargetMachine(llvm::TargetOptions const&, llvm::CodeGenOptLevel, std::optional<tsl::port::CPUFeature>) /proc/self/cwd/external/xla/xla/backends/cpu/codegen/jit_compiler.cc:88:12 (xla_extension.so+0x48d096f) (BuildId: 6fa88e3910a5eb04) #3 xla::cpu::CpuCompiler::RunHloPasses(std::unique_ptr<xla::HloModule, std::default_delete<xla::HloModule>>, stream_executor::StreamExecutor*, xla::Compiler::CompileOptions const&) /proc/self/cwd/external/xla/xla/service/cpu/cpu_compiler.cc:1017:3 (xla_extension.so+0x2f70857) (BuildId: 6fa88e3910a5eb04) #4 xla::JitCompile(xla::XlaComputation const&, absl::lts_20230802::Span<xla::Shape const* const>, xla::ExecutableBuildOptions const&, xla::ExecutionOptions const&, xla::Compiler::CompileOptions const&, int, std::function<void (xla::HloModuleConfig&)>) /proc/self/cwd/external/xla/xla/pjrt/cpu/cpu_client.cc:754:3 (xla_extension.so+0x2f12874) (BuildId: 6fa88e3910a5eb04) openxla#5 xla::TfrtCpuClient::Compile(xla::XlaComputation const&, xla::CompileOptions) /proc/self/cwd/external/xla/xla/pjrt/cpu/cpu_client.cc:847:3 (xla_extension.so+0x2f12874) openxla#6 xla::TfrtCpuClient::Compile(mlir::ModuleOp, xla::CompileOptions) /proc/self/cwd/external/xla/xla/pjrt/cpu/cpu_client.cc:893:10 (xla_extension.so+0x2f13ef2) (BuildId: 6fa88e3910a5eb04) ``` PiperOrigin-RevId: 707701032
1 parent 6bdae60 commit 73e702b

2 files changed

Lines changed: 12 additions & 7 deletions

File tree

xla/backends/cpu/codegen/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ cc_library(
8888
"//xla:util",
8989
"//xla/backends/cpu/runtime:function_library",
9090
"//xla/service/cpu:orc_jit_memory_mapper",
91+
"@com_google_absl//absl/base",
9192
"@com_google_absl//absl/base:core_headers",
9293
"@com_google_absl//absl/container:flat_hash_map",
9394
"@com_google_absl//absl/functional:any_invocable",

xla/backends/cpu/codegen/jit_compiler.cc

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ limitations under the License.
2222
#include <string>
2323
#include <utility>
2424

25+
#include "absl/base/call_once.h"
2526
#include "absl/base/thread_annotations.h"
2627
#include "absl/container/flat_hash_map.h"
2728
#include "absl/status/status.h"
@@ -65,6 +66,14 @@ namespace xla::cpu {
6566
using tsl::profiler::TraceMe;
6667
using tsl::profiler::TraceMeEncode;
6768

69+
// Initialize LLVM the first time `JitCompiler` is created.
70+
static void InitializeLLVMTarget() {
71+
llvm::InitializeNativeTarget();
72+
llvm::InitializeNativeTargetAsmPrinter();
73+
}
74+
75+
absl::once_flag initialize_llvm_flag;
76+
6877
absl::StatusOr<std::unique_ptr<llvm::TargetMachine>>
6978
JitCompiler::InferTargetMachine(
7079
const llvm::TargetOptions& target_options, llvm::CodeGenOptLevel opt_level,
@@ -81,6 +90,7 @@ JitCompiler::InferTargetMachine(
8190
? CpuTargetFromMaxFeature(*max_cpu_feature)
8291
: absl::string_view(llvm::sys::getHostCPUName());
8392

93+
absl::call_once(initialize_llvm_flag, InitializeLLVMTarget);
8494
std::unique_ptr<llvm::TargetMachine> target_machine(
8595
llvm::EngineBuilder()
8696
.setTargetOptions(target_options)
@@ -108,13 +118,7 @@ IrCompiler::TargetMachineBuilder JitCompiler::InferTargetMachineBuilder(
108118
absl::StatusOr<JitCompiler> JitCompiler::Create(
109119
llvm::TargetOptions target_options, Options options,
110120
TaskRunner task_runner) {
111-
// Initialize LLVM the first time `JitCompiler` is created.
112-
static bool llvm_initialized = [] {
113-
llvm::InitializeNativeTarget();
114-
llvm::InitializeNativeTargetAsmPrinter();
115-
return true;
116-
}();
117-
CHECK(llvm_initialized) << "LLVM must be initialized";
121+
absl::call_once(initialize_llvm_flag, InitializeLLVMTarget);
118122

119123
// Infer target machine from the current host CPU.
120124
IrCompiler::TargetMachineBuilder target_machine_builder =

0 commit comments

Comments
 (0)