Add CROSSTOOL for Windows GPU build with nvcc compiler
After this change, to build TensorFlow with GPU support on Windows, you just need to follow the same procedure as Linux. Also re-enable remote cache since the bug in b/111106393 has been fixed by the new wrapper script. The clean-up of the wrapper scripts also made the build around 5 mins faster than using Bazel's msvc wrapper script. PiperOrigin-RevId: 204105368
This commit is contained in:
parent
78d4d1ad46
commit
ab39198ace
configure.py
tensorflow/tools/ci_build/windows/bazel
third_party/gpus
tools
27
configure.py
27
configure.py
@ -1236,28 +1236,13 @@ def set_tf_cuda_compute_capabilities(environ_cp):
|
||||
|
||||
def set_other_cuda_vars(environ_cp):
|
||||
"""Set other CUDA related variables."""
|
||||
if is_windows():
|
||||
# The following three variables are needed for MSVC toolchain configuration
|
||||
# in Bazel
|
||||
environ_cp['CUDA_PATH'] = environ_cp.get('CUDA_TOOLKIT_PATH')
|
||||
environ_cp['CUDA_COMPUTE_CAPABILITIES'] = environ_cp.get(
|
||||
'TF_CUDA_COMPUTE_CAPABILITIES')
|
||||
environ_cp['NO_WHOLE_ARCHIVE_OPTION'] = 1
|
||||
write_action_env_to_bazelrc('CUDA_PATH', environ_cp.get('CUDA_PATH'))
|
||||
write_action_env_to_bazelrc('CUDA_COMPUTE_CAPABILITIE',
|
||||
environ_cp.get('CUDA_COMPUTE_CAPABILITIE'))
|
||||
write_action_env_to_bazelrc('NO_WHOLE_ARCHIVE_OPTION',
|
||||
environ_cp.get('NO_WHOLE_ARCHIVE_OPTION'))
|
||||
write_to_bazelrc('build --config=win-cuda')
|
||||
write_to_bazelrc('test --config=win-cuda')
|
||||
# If CUDA is enabled, always use GPU during build and test.
|
||||
if environ_cp.get('TF_CUDA_CLANG') == '1':
|
||||
write_to_bazelrc('build --config=cuda_clang')
|
||||
write_to_bazelrc('test --config=cuda_clang')
|
||||
else:
|
||||
# If CUDA is enabled, always use GPU during build and test.
|
||||
if environ_cp.get('TF_CUDA_CLANG') == '1':
|
||||
write_to_bazelrc('build --config=cuda_clang')
|
||||
write_to_bazelrc('test --config=cuda_clang')
|
||||
else:
|
||||
write_to_bazelrc('build --config=cuda')
|
||||
write_to_bazelrc('test --config=cuda')
|
||||
write_to_bazelrc('build --config=cuda')
|
||||
write_to_bazelrc('test --config=cuda')
|
||||
|
||||
|
||||
def set_host_cxx_compiler(environ_cp):
|
||||
|
@ -23,10 +23,6 @@ function run_configure_for_gpu_build {
|
||||
# Enable CUDA support
|
||||
export TF_NEED_CUDA=1
|
||||
|
||||
# TODO(pcloudy): Remove this after TensorFlow uses its own CRSOOTOOL
|
||||
# for GPU build on Windows
|
||||
export USE_MSVC_WRAPPER=1
|
||||
|
||||
yes "" | ./configure
|
||||
}
|
||||
|
||||
|
20
third_party/gpus/crosstool/BUILD.tpl
vendored
20
third_party/gpus/crosstool/BUILD.tpl
vendored
@ -7,6 +7,7 @@ cc_toolchain_suite(
|
||||
toolchains = {
|
||||
"local|compiler": ":cc-compiler-local",
|
||||
"darwin|compiler": ":cc-compiler-darwin",
|
||||
"x64_windows|msvc-cl": ":cc-compiler-windows",
|
||||
},
|
||||
)
|
||||
|
||||
@ -42,6 +43,20 @@ cc_toolchain(
|
||||
supports_param_files = 0,
|
||||
)
|
||||
|
||||
cc_toolchain(
|
||||
name = "cc-compiler-windows",
|
||||
all_files = "%{win_linker_files}",
|
||||
compiler_files = ":empty",
|
||||
cpu = "x64_windows",
|
||||
dwp_files = ":empty",
|
||||
dynamic_runtime_libs = [":empty"],
|
||||
linker_files = "%{win_linker_files}",
|
||||
objcopy_files = ":empty",
|
||||
static_runtime_libs = [":empty"],
|
||||
strip_files = ":empty",
|
||||
supports_param_files = 1,
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "empty",
|
||||
srcs = [],
|
||||
@ -51,3 +66,8 @@ filegroup(
|
||||
name = "crosstool_wrapper_driver_is_not_gcc",
|
||||
srcs = ["clang/bin/crosstool_wrapper_driver_is_not_gcc"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "windows_msvc_wrapper_files",
|
||||
srcs = glob(["windows/msvc_*"]),
|
||||
)
|
||||
|
869
third_party/gpus/crosstool/CROSSTOOL.tpl
vendored
869
third_party/gpus/crosstool/CROSSTOOL.tpl
vendored
@ -22,6 +22,10 @@ default_toolchain {
|
||||
cpu: "ppc"
|
||||
toolchain_identifier: "local_linux"
|
||||
}
|
||||
default_toolchain {
|
||||
cpu: "x64_windows"
|
||||
toolchain_identifier: "local_windows"
|
||||
}
|
||||
|
||||
toolchain {
|
||||
abi_version: "local"
|
||||
@ -537,3 +541,868 @@ toolchain {
|
||||
|
||||
%{host_compiler_includes}
|
||||
}
|
||||
|
||||
toolchain {
|
||||
toolchain_identifier: "local_windows"
|
||||
host_system_name: "local"
|
||||
target_system_name: "local"
|
||||
|
||||
abi_version: "local"
|
||||
abi_libc_version: "local"
|
||||
target_cpu: "x64_windows"
|
||||
compiler: "msvc-cl"
|
||||
target_libc: "msvcrt"
|
||||
|
||||
%{cxx_builtin_include_directory}
|
||||
|
||||
tool_path {
|
||||
name: "ar"
|
||||
path: "%{msvc_lib_path}"
|
||||
}
|
||||
tool_path {
|
||||
name: "ml"
|
||||
path: "%{msvc_ml_path}"
|
||||
}
|
||||
tool_path {
|
||||
name: "cpp"
|
||||
path: "%{msvc_cl_path}"
|
||||
}
|
||||
tool_path {
|
||||
name: "gcc"
|
||||
path: "%{msvc_cl_path}"
|
||||
}
|
||||
tool_path {
|
||||
name: "gcov"
|
||||
path: "wrapper/bin/msvc_nop.bat"
|
||||
}
|
||||
tool_path {
|
||||
name: "ld"
|
||||
path: "%{msvc_link_path}"
|
||||
}
|
||||
tool_path {
|
||||
name: "nm"
|
||||
path: "wrapper/bin/msvc_nop.bat"
|
||||
}
|
||||
tool_path {
|
||||
name: "objcopy"
|
||||
path: "wrapper/bin/msvc_nop.bat"
|
||||
}
|
||||
tool_path {
|
||||
name: "objdump"
|
||||
path: "wrapper/bin/msvc_nop.bat"
|
||||
}
|
||||
tool_path {
|
||||
name: "strip"
|
||||
path: "wrapper/bin/msvc_nop.bat"
|
||||
}
|
||||
supports_interface_shared_objects: true
|
||||
|
||||
# TODO(pcloudy): Review those flags below, they should be defined by cl.exe
|
||||
compiler_flag: "/DCOMPILER_MSVC"
|
||||
|
||||
# Don't define min/max macros in windows.h.
|
||||
compiler_flag: "/DNOMINMAX"
|
||||
|
||||
# Platform defines.
|
||||
compiler_flag: "/D_WIN32_WINNT=0x0600"
|
||||
# Turn off warning messages.
|
||||
compiler_flag: "/D_CRT_SECURE_NO_DEPRECATE"
|
||||
compiler_flag: "/D_CRT_SECURE_NO_WARNINGS"
|
||||
compiler_flag: "/D_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS"
|
||||
|
||||
# Useful options to have on for compilation.
|
||||
# Increase the capacity of object files to 2^32 sections.
|
||||
compiler_flag: "/bigobj"
|
||||
# Allocate 500MB for precomputed headers.
|
||||
compiler_flag: "/Zm500"
|
||||
# Use unsigned char by default.
|
||||
compiler_flag: "/J"
|
||||
# Use function level linking.
|
||||
compiler_flag: "/Gy"
|
||||
# Use string pooling.
|
||||
compiler_flag: "/GF"
|
||||
# Catch C++ exceptions only and tell the compiler to assume that functions declared
|
||||
# as extern "C" never throw a C++ exception.
|
||||
compiler_flag: "/EHsc"
|
||||
|
||||
# Globally disabled warnings.
|
||||
# Don't warn about elements of array being be default initialized.
|
||||
compiler_flag: "/wd4351"
|
||||
# Don't warn about no matching delete found.
|
||||
compiler_flag: "/wd4291"
|
||||
# Don't warn about diamond inheritance patterns.
|
||||
compiler_flag: "/wd4250"
|
||||
# Don't warn about insecure functions (e.g. non _s functions).
|
||||
compiler_flag: "/wd4996"
|
||||
|
||||
linker_flag: "/MACHINE:X64"
|
||||
|
||||
feature {
|
||||
name: "no_legacy_features"
|
||||
}
|
||||
|
||||
# Suppress startup banner.
|
||||
feature {
|
||||
name: "nologo"
|
||||
flag_set {
|
||||
action: "c-compile"
|
||||
action: "c++-compile"
|
||||
action: "c++-module-compile"
|
||||
action: "c++-module-codegen"
|
||||
action: "c++-header-parsing"
|
||||
action: "assemble"
|
||||
action: "preprocess-assemble"
|
||||
action: "c++-link-executable"
|
||||
action: "c++-link-dynamic-library"
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
action: "c++-link-static-library"
|
||||
flag_group {
|
||||
flag: "/nologo"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'has_configured_linker_path'
|
||||
}
|
||||
|
||||
# This feature indicates strip is not supported, building stripped binary will just result a copy of orignial binary
|
||||
feature {
|
||||
name: 'no_stripping'
|
||||
}
|
||||
|
||||
# This feature indicates this is a toolchain targeting Windows.
|
||||
feature {
|
||||
name: 'targets_windows'
|
||||
implies: 'copy_dynamic_libraries_to_binary'
|
||||
enabled: true
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'copy_dynamic_libraries_to_binary'
|
||||
}
|
||||
|
||||
action_config {
|
||||
config_name: 'assemble'
|
||||
action_name: 'assemble'
|
||||
tool {
|
||||
tool_path: '%{msvc_ml_path}'
|
||||
}
|
||||
implies: 'compiler_input_flags'
|
||||
implies: 'compiler_output_flags'
|
||||
implies: 'nologo'
|
||||
implies: 'msvc_env'
|
||||
implies: 'sysroot'
|
||||
}
|
||||
|
||||
action_config {
|
||||
config_name: 'preprocess-assemble'
|
||||
action_name: 'preprocess-assemble'
|
||||
tool {
|
||||
tool_path: '%{msvc_ml_path}'
|
||||
}
|
||||
implies: 'compiler_input_flags'
|
||||
implies: 'compiler_output_flags'
|
||||
implies: 'nologo'
|
||||
implies: 'msvc_env'
|
||||
implies: 'sysroot'
|
||||
}
|
||||
|
||||
action_config {
|
||||
config_name: 'c-compile'
|
||||
action_name: 'c-compile'
|
||||
tool {
|
||||
tool_path: '%{msvc_cl_path}'
|
||||
}
|
||||
implies: 'compiler_input_flags'
|
||||
implies: 'compiler_output_flags'
|
||||
implies: 'legacy_compile_flags'
|
||||
implies: 'nologo'
|
||||
implies: 'msvc_env'
|
||||
implies: 'parse_showincludes'
|
||||
implies: 'user_compile_flags'
|
||||
implies: 'sysroot'
|
||||
implies: 'unfiltered_compile_flags'
|
||||
}
|
||||
|
||||
action_config {
|
||||
config_name: 'c++-compile'
|
||||
action_name: 'c++-compile'
|
||||
tool {
|
||||
tool_path: '%{msvc_cl_path}'
|
||||
}
|
||||
implies: 'compiler_input_flags'
|
||||
implies: 'compiler_output_flags'
|
||||
implies: 'legacy_compile_flags'
|
||||
implies: 'nologo'
|
||||
implies: 'msvc_env'
|
||||
implies: 'parse_showincludes'
|
||||
implies: 'user_compile_flags'
|
||||
implies: 'sysroot'
|
||||
implies: 'unfiltered_compile_flags'
|
||||
}
|
||||
|
||||
action_config {
|
||||
config_name: 'c++-link-executable'
|
||||
action_name: 'c++-link-executable'
|
||||
tool {
|
||||
tool_path: '%{msvc_link_path}'
|
||||
}
|
||||
implies: 'nologo'
|
||||
implies: 'linkstamps'
|
||||
implies: 'output_execpath_flags'
|
||||
implies: 'input_param_flags'
|
||||
implies: 'user_link_flags'
|
||||
implies: 'legacy_link_flags'
|
||||
implies: 'linker_subsystem_flag'
|
||||
implies: 'linker_param_file'
|
||||
implies: 'msvc_env'
|
||||
implies: 'no_stripping'
|
||||
}
|
||||
|
||||
action_config {
|
||||
config_name: 'c++-link-dynamic-library'
|
||||
action_name: 'c++-link-dynamic-library'
|
||||
tool {
|
||||
tool_path: '%{msvc_link_path}'
|
||||
}
|
||||
implies: 'nologo'
|
||||
implies: 'shared_flag'
|
||||
implies: 'linkstamps'
|
||||
implies: 'output_execpath_flags'
|
||||
implies: 'input_param_flags'
|
||||
implies: 'user_link_flags'
|
||||
implies: 'legacy_link_flags'
|
||||
implies: 'linker_subsystem_flag'
|
||||
implies: 'linker_param_file'
|
||||
implies: 'msvc_env'
|
||||
implies: 'no_stripping'
|
||||
implies: 'has_configured_linker_path'
|
||||
implies: 'def_file'
|
||||
}
|
||||
|
||||
action_config {
|
||||
config_name: 'c++-link-nodeps-dynamic-library'
|
||||
action_name: 'c++-link-nodeps-dynamic-library'
|
||||
tool {
|
||||
tool_path: '%{msvc_link_path}'
|
||||
}
|
||||
implies: 'nologo'
|
||||
implies: 'shared_flag'
|
||||
implies: 'linkstamps'
|
||||
implies: 'output_execpath_flags'
|
||||
implies: 'input_param_flags'
|
||||
implies: 'user_link_flags'
|
||||
implies: 'legacy_link_flags'
|
||||
implies: 'linker_subsystem_flag'
|
||||
implies: 'linker_param_file'
|
||||
implies: 'msvc_env'
|
||||
implies: 'no_stripping'
|
||||
implies: 'has_configured_linker_path'
|
||||
implies: 'def_file'
|
||||
}
|
||||
|
||||
action_config {
|
||||
config_name: 'c++-link-static-library'
|
||||
action_name: 'c++-link-static-library'
|
||||
tool {
|
||||
tool_path: '%{msvc_lib_path}'
|
||||
}
|
||||
implies: 'nologo'
|
||||
implies: 'archiver_flags'
|
||||
implies: 'input_param_flags'
|
||||
implies: 'linker_param_file'
|
||||
implies: 'msvc_env'
|
||||
}
|
||||
|
||||
# TODO(b/65151735): Remove legacy_compile_flags feature when legacy fields are
|
||||
# not used in this crosstool
|
||||
feature {
|
||||
name: 'legacy_compile_flags'
|
||||
flag_set {
|
||||
expand_if_all_available: 'legacy_compile_flags'
|
||||
action: 'preprocess-assemble'
|
||||
action: 'c-compile'
|
||||
action: 'c++-compile'
|
||||
action: 'c++-header-parsing'
|
||||
action: 'c++-module-compile'
|
||||
action: 'c++-module-codegen'
|
||||
flag_group {
|
||||
iterate_over: 'legacy_compile_flags'
|
||||
flag: '%{legacy_compile_flags}'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: "msvc_env"
|
||||
env_set {
|
||||
action: "c-compile"
|
||||
action: "c++-compile"
|
||||
action: "c++-module-compile"
|
||||
action: "c++-module-codegen"
|
||||
action: "c++-header-parsing"
|
||||
action: "assemble"
|
||||
action: "preprocess-assemble"
|
||||
action: "c++-link-executable"
|
||||
action: "c++-link-dynamic-library"
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
action: "c++-link-static-library"
|
||||
env_entry {
|
||||
key: "PATH"
|
||||
value: "%{msvc_env_path}"
|
||||
}
|
||||
env_entry {
|
||||
key: "INCLUDE"
|
||||
value: "%{msvc_env_include}"
|
||||
}
|
||||
env_entry {
|
||||
key: "LIB"
|
||||
value: "%{msvc_env_lib}"
|
||||
}
|
||||
env_entry {
|
||||
key: "TMP"
|
||||
value: "%{msvc_env_tmp}"
|
||||
}
|
||||
env_entry {
|
||||
key: "TEMP"
|
||||
value: "%{msvc_env_tmp}"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'include_paths'
|
||||
flag_set {
|
||||
action: "assemble"
|
||||
action: 'preprocess-assemble'
|
||||
action: 'c-compile'
|
||||
action: 'c++-compile'
|
||||
action: 'c++-header-parsing'
|
||||
action: 'c++-module-compile'
|
||||
flag_group {
|
||||
iterate_over: 'quote_include_paths'
|
||||
flag: '/I%{quote_include_paths}'
|
||||
}
|
||||
flag_group {
|
||||
iterate_over: 'include_paths'
|
||||
flag: '/I%{include_paths}'
|
||||
}
|
||||
flag_group {
|
||||
iterate_over: 'system_include_paths'
|
||||
flag: '/I%{system_include_paths}'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: "preprocessor_defines"
|
||||
flag_set {
|
||||
action: "assemble"
|
||||
action: "preprocess-assemble"
|
||||
action: "c-compile"
|
||||
action: "c++-compile"
|
||||
action: "c++-header-parsing"
|
||||
action: "c++-module-compile"
|
||||
flag_group {
|
||||
flag: "/D%{preprocessor_defines}"
|
||||
iterate_over: "preprocessor_defines"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Tell Bazel to parse the output of /showIncludes
|
||||
feature {
|
||||
name: 'parse_showincludes'
|
||||
flag_set {
|
||||
action: 'preprocess-assemble'
|
||||
action: 'c-compile'
|
||||
action: 'c++-compile'
|
||||
action: 'c++-module-compile'
|
||||
action: 'c++-header-parsing'
|
||||
flag_group {
|
||||
flag: "/showIncludes"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
feature {
|
||||
name: 'generate_pdb_file'
|
||||
requires: {
|
||||
feature: 'dbg'
|
||||
}
|
||||
requires: {
|
||||
feature: 'fastbuild'
|
||||
}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'shared_flag'
|
||||
flag_set {
|
||||
action: 'c++-link-dynamic-library'
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
flag_group {
|
||||
flag: '/DLL'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'linkstamps'
|
||||
flag_set {
|
||||
action: 'c++-link-executable'
|
||||
action: 'c++-link-dynamic-library'
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
expand_if_all_available: 'linkstamp_paths'
|
||||
flag_group {
|
||||
iterate_over: 'linkstamp_paths'
|
||||
flag: '%{linkstamp_paths}'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'output_execpath_flags'
|
||||
flag_set {
|
||||
expand_if_all_available: 'output_execpath'
|
||||
action: 'c++-link-executable'
|
||||
action: 'c++-link-dynamic-library'
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
flag_group {
|
||||
flag: '/OUT:%{output_execpath}'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'archiver_flags'
|
||||
flag_set {
|
||||
expand_if_all_available: 'output_execpath'
|
||||
action: 'c++-link-static-library'
|
||||
flag_group {
|
||||
flag: '/OUT:%{output_execpath}'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'input_param_flags'
|
||||
flag_set {
|
||||
expand_if_all_available: 'interface_library_output_path'
|
||||
action: 'c++-link-dynamic-library'
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
flag_group {
|
||||
flag: "/IMPLIB:%{interface_library_output_path}"
|
||||
}
|
||||
}
|
||||
flag_set {
|
||||
expand_if_all_available: 'libopts'
|
||||
action: 'c++-link-executable'
|
||||
action: 'c++-link-dynamic-library'
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
flag_group {
|
||||
iterate_over: 'libopts'
|
||||
flag: '%{libopts}'
|
||||
}
|
||||
}
|
||||
flag_set {
|
||||
expand_if_all_available: 'libraries_to_link'
|
||||
action: 'c++-link-executable'
|
||||
action: 'c++-link-dynamic-library'
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
action: 'c++-link-static-library'
|
||||
flag_group {
|
||||
iterate_over: 'libraries_to_link'
|
||||
flag_group {
|
||||
expand_if_equal: {
|
||||
variable: 'libraries_to_link.type'
|
||||
value: 'object_file_group'
|
||||
}
|
||||
iterate_over: 'libraries_to_link.object_files'
|
||||
flag_group {
|
||||
flag: '%{libraries_to_link.object_files}'
|
||||
}
|
||||
}
|
||||
flag_group {
|
||||
expand_if_equal: {
|
||||
variable: 'libraries_to_link.type'
|
||||
value: 'object_file'
|
||||
}
|
||||
flag_group {
|
||||
flag: '%{libraries_to_link.name}'
|
||||
}
|
||||
}
|
||||
flag_group {
|
||||
expand_if_equal: {
|
||||
variable: 'libraries_to_link.type'
|
||||
value: 'interface_library'
|
||||
}
|
||||
flag_group {
|
||||
flag: '%{libraries_to_link.name}'
|
||||
}
|
||||
}
|
||||
flag_group {
|
||||
expand_if_equal: {
|
||||
variable: 'libraries_to_link.type'
|
||||
value: 'static_library'
|
||||
}
|
||||
flag_group {
|
||||
expand_if_false: 'libraries_to_link.is_whole_archive'
|
||||
flag: '%{libraries_to_link.name}'
|
||||
}
|
||||
flag_group {
|
||||
expand_if_true: 'libraries_to_link.is_whole_archive'
|
||||
flag: '/WHOLEARCHIVE:%{libraries_to_link.name}'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Since this feature is declared earlier in the CROSSTOOL than
|
||||
# "user_link_flags", this feature will be applied prior to it anwyhere they
|
||||
# are both implied. And since "user_link_flags" contains the linkopts from
|
||||
# the build rule, this allows the user to override the /SUBSYSTEM in the BUILD
|
||||
# file.
|
||||
feature {
|
||||
name: 'linker_subsystem_flag'
|
||||
flag_set {
|
||||
action: 'c++-link-executable'
|
||||
action: 'c++-link-dynamic-library'
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
flag_group {
|
||||
flag: '/SUBSYSTEM:CONSOLE'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# The "user_link_flags" contains user-defined linkopts (from build rules)
|
||||
# so it should be defined after features that declare user-overridable flags.
|
||||
# For example the "linker_subsystem_flag" defines a default "/SUBSYSTEM" flag
|
||||
# but we want to let the user override it, therefore "link_flag_subsystem" is
|
||||
# defined earlier in the CROSSTOOL file than "user_link_flags".
|
||||
feature {
|
||||
name: 'user_link_flags'
|
||||
flag_set {
|
||||
expand_if_all_available: 'user_link_flags'
|
||||
action: 'c++-link-executable'
|
||||
action: 'c++-link-dynamic-library'
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
flag_group {
|
||||
iterate_over: 'user_link_flags'
|
||||
flag: '%{user_link_flags}'
|
||||
}
|
||||
}
|
||||
}
|
||||
feature {
|
||||
name: 'legacy_link_flags'
|
||||
flag_set {
|
||||
expand_if_all_available: 'legacy_link_flags'
|
||||
action: 'c++-link-executable'
|
||||
action: 'c++-link-dynamic-library'
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
flag_group {
|
||||
iterate_over: 'legacy_link_flags'
|
||||
flag: '%{legacy_link_flags}'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'linker_param_file'
|
||||
flag_set {
|
||||
expand_if_all_available: 'linker_param_file'
|
||||
action: 'c++-link-executable'
|
||||
action: 'c++-link-dynamic-library'
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
action: 'c++-link-static-library'
|
||||
flag_group {
|
||||
flag: '@%{linker_param_file}'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'static_link_msvcrt'
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'static_link_msvcrt_no_debug'
|
||||
flag_set {
|
||||
action: 'c-compile'
|
||||
action: 'c++-compile'
|
||||
flag_group {
|
||||
flag: "/MT"
|
||||
}
|
||||
}
|
||||
flag_set {
|
||||
action: 'c++-link-executable'
|
||||
action: 'c++-link-dynamic-library'
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
flag_group {
|
||||
flag: "/DEFAULTLIB:libcmt.lib"
|
||||
}
|
||||
}
|
||||
requires: { feature: 'fastbuild'}
|
||||
requires: { feature: 'opt'}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'dynamic_link_msvcrt_no_debug'
|
||||
flag_set {
|
||||
action: 'c-compile'
|
||||
action: 'c++-compile'
|
||||
flag_group {
|
||||
flag: "/MD"
|
||||
}
|
||||
}
|
||||
flag_set {
|
||||
action: 'c++-link-executable'
|
||||
action: 'c++-link-dynamic-library'
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
flag_group {
|
||||
flag: "/DEFAULTLIB:msvcrt.lib"
|
||||
}
|
||||
}
|
||||
requires: { feature: 'fastbuild'}
|
||||
requires: { feature: 'opt'}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'static_link_msvcrt_debug'
|
||||
flag_set {
|
||||
action: 'c-compile'
|
||||
action: 'c++-compile'
|
||||
flag_group {
|
||||
flag: "/MTd"
|
||||
}
|
||||
}
|
||||
flag_set {
|
||||
action: 'c++-link-executable'
|
||||
action: 'c++-link-dynamic-library'
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
flag_group {
|
||||
flag: "/DEFAULTLIB:libcmtd.lib"
|
||||
}
|
||||
}
|
||||
requires: { feature: 'dbg'}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'dynamic_link_msvcrt_debug'
|
||||
flag_set {
|
||||
action: 'c-compile'
|
||||
action: 'c++-compile'
|
||||
flag_group {
|
||||
flag: "/MDd"
|
||||
}
|
||||
}
|
||||
flag_set {
|
||||
action: 'c++-link-executable'
|
||||
action: 'c++-link-dynamic-library'
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
flag_group {
|
||||
flag: "/DEFAULTLIB:msvcrtd.lib"
|
||||
}
|
||||
}
|
||||
requires: { feature: 'dbg'}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'dbg'
|
||||
flag_set {
|
||||
action: 'c-compile'
|
||||
action: 'c++-compile'
|
||||
flag_group {
|
||||
flag: "/Od"
|
||||
flag: "/Z7"
|
||||
flag: "/DDEBUG"
|
||||
}
|
||||
}
|
||||
flag_set {
|
||||
action: 'c++-link-executable'
|
||||
action: 'c++-link-dynamic-library'
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
flag_group {
|
||||
flag: "/DEBUG:FULL"
|
||||
flag: "/INCREMENTAL:NO"
|
||||
}
|
||||
}
|
||||
implies: 'generate_pdb_file'
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'fastbuild'
|
||||
flag_set {
|
||||
action: 'c-compile'
|
||||
action: 'c++-compile'
|
||||
flag_group {
|
||||
flag: "/Od"
|
||||
flag: "/Z7"
|
||||
flag: "/DDEBUG"
|
||||
}
|
||||
}
|
||||
flag_set {
|
||||
action: 'c++-link-executable'
|
||||
action: 'c++-link-dynamic-library'
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
flag_group {
|
||||
flag: "/DEBUG:FASTLINK"
|
||||
flag: "/INCREMENTAL:NO"
|
||||
}
|
||||
}
|
||||
implies: 'generate_pdb_file'
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'opt'
|
||||
flag_set {
|
||||
action: 'c-compile'
|
||||
action: 'c++-compile'
|
||||
flag_group {
|
||||
flag: "/O2"
|
||||
flag: "/DNDEBUG"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'user_compile_flags'
|
||||
flag_set {
|
||||
expand_if_all_available: 'user_compile_flags'
|
||||
action: 'preprocess-assemble'
|
||||
action: 'c-compile'
|
||||
action: 'c++-compile'
|
||||
action: 'c++-header-parsing'
|
||||
action: 'c++-module-compile'
|
||||
action: 'c++-module-codegen'
|
||||
flag_group {
|
||||
iterate_over: 'user_compile_flags'
|
||||
flag: '%{user_compile_flags}'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'sysroot'
|
||||
flag_set {
|
||||
expand_if_all_available: 'sysroot'
|
||||
action: 'assemble'
|
||||
action: 'preprocess-assemble'
|
||||
action: 'c-compile'
|
||||
action: 'c++-compile'
|
||||
action: 'c++-header-parsing'
|
||||
action: 'c++-module-compile'
|
||||
action: 'c++-module-codegen'
|
||||
action: 'c++-link-executable'
|
||||
action: 'c++-link-dynamic-library'
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
flag_group {
|
||||
iterate_over: 'sysroot'
|
||||
flag: '--sysroot=%{sysroot}'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'unfiltered_compile_flags'
|
||||
flag_set {
|
||||
expand_if_all_available: 'unfiltered_compile_flags'
|
||||
action: 'preprocess-assemble'
|
||||
action: 'c-compile'
|
||||
action: 'c++-compile'
|
||||
action: 'c++-header-parsing'
|
||||
action: 'c++-module-compile'
|
||||
action: 'c++-module-codegen'
|
||||
flag_group {
|
||||
iterate_over: 'unfiltered_compile_flags'
|
||||
flag: '%{unfiltered_compile_flags}'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'compiler_output_flags'
|
||||
flag_set {
|
||||
action: 'assemble'
|
||||
flag_group {
|
||||
expand_if_all_available: 'output_file'
|
||||
expand_if_none_available: 'output_assembly_file'
|
||||
expand_if_none_available: 'output_preprocess_file'
|
||||
flag: '/Fo%{output_file}'
|
||||
flag: '/Zi'
|
||||
}
|
||||
}
|
||||
flag_set {
|
||||
action: 'preprocess-assemble'
|
||||
action: 'c-compile'
|
||||
action: 'c++-compile'
|
||||
action: 'c++-header-parsing'
|
||||
action: 'c++-module-compile'
|
||||
action: 'c++-module-codegen'
|
||||
flag_group {
|
||||
expand_if_all_available: 'output_file'
|
||||
expand_if_none_available: 'output_assembly_file'
|
||||
expand_if_none_available: 'output_preprocess_file'
|
||||
flag: '/Fo%{output_file}'
|
||||
}
|
||||
flag_group {
|
||||
expand_if_all_available: 'output_file'
|
||||
expand_if_all_available: 'output_assembly_file'
|
||||
flag: '/Fa%{output_file}'
|
||||
}
|
||||
flag_group {
|
||||
expand_if_all_available: 'output_file'
|
||||
expand_if_all_available: 'output_preprocess_file'
|
||||
flag: '/P'
|
||||
flag: '/Fi%{output_file}'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'compiler_input_flags'
|
||||
flag_set {
|
||||
action: 'assemble'
|
||||
action: 'preprocess-assemble'
|
||||
action: 'c-compile'
|
||||
action: 'c++-compile'
|
||||
action: 'c++-header-parsing'
|
||||
action: 'c++-module-compile'
|
||||
action: 'c++-module-codegen'
|
||||
flag_group {
|
||||
expand_if_all_available: 'source_file'
|
||||
flag: '/c'
|
||||
flag: '%{source_file}'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
feature {
|
||||
name : 'def_file',
|
||||
flag_set {
|
||||
expand_if_all_available: 'def_file_path'
|
||||
action: 'c++-link-executable'
|
||||
action: 'c++-link-dynamic-library'
|
||||
action: "c++-link-nodeps-dynamic-library"
|
||||
flag_group {
|
||||
flag: "/DEF:%{def_file_path}"
|
||||
# We can specify a different DLL name in DEF file, /ignore:4070 suppresses
|
||||
# the warning message about DLL name doesn't match the default one.
|
||||
# See https://msdn.microsoft.com/en-us/library/sfkk2fz7.aspx
|
||||
flag: "/ignore:4070"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'windows_export_all_symbols'
|
||||
}
|
||||
|
||||
feature {
|
||||
name: 'no_windows_export_all_symbols'
|
||||
}
|
||||
|
||||
linking_mode_flags { mode: DYNAMIC }
|
||||
}
|
||||
|
20
third_party/gpus/crosstool/windows/msvc_wrapper_for_nvcc.bat.tpl
vendored
Normal file
20
third_party/gpus/crosstool/windows/msvc_wrapper_for_nvcc.bat.tpl
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
:: Copyright 2015 The TensorFlow Authors. All Rights Reserved.
|
||||
::
|
||||
:: Licensed under the Apache License, Version 2.0 (the "License");
|
||||
:: you may not use this file except in compliance with the License.
|
||||
:: You may obtain a copy of the License at
|
||||
::
|
||||
:: http://www.apache.org/licenses/LICENSE-2.0
|
||||
::
|
||||
:: Unless required by applicable law or agreed to in writing, software
|
||||
:: distributed under the License is distributed on an "AS IS" BASIS,
|
||||
:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
:: See the License for the specific language governing permissions and
|
||||
:: limitations under the License.
|
||||
:: =============================================================================
|
||||
|
||||
:: Invoke msvc_wrapper_for_nvcc.py, which is located in the same directory.
|
||||
@echo OFF
|
||||
set arg0=%~0
|
||||
for %%F in ("%arg0%") do set DRIVER_BIN=%%~dpF
|
||||
"%{python_binary}" -B "%DRIVER_BIN%\msvc_wrapper_for_nvcc.py" %*
|
192
third_party/gpus/crosstool/windows/msvc_wrapper_for_nvcc.py.tpl
vendored
Normal file
192
third_party/gpus/crosstool/windows/msvc_wrapper_for_nvcc.py.tpl
vendored
Normal file
@ -0,0 +1,192 @@
|
||||
#!/usr/bin/env python
|
||||
# Copyright 2015 The TensorFlow Authors. All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# ==============================================================================
|
||||
|
||||
"""Crosstool wrapper for compiling CUDA programs with nvcc on Windows.
|
||||
|
||||
DESCRIPTION:
|
||||
This script is the Windows version of //third_party/gpus/crosstool/crosstool_wrapper_is_not_gcc
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
from argparse import ArgumentParser
|
||||
import os
|
||||
import subprocess
|
||||
import re
|
||||
import sys
|
||||
import pipes
|
||||
|
||||
# Template values set by cuda_autoconf.
|
||||
CPU_COMPILER = ('%{cpu_compiler}')
|
||||
GCC_HOST_COMPILER_PATH = ('%{gcc_host_compiler_path}')
|
||||
|
||||
NVCC_PATH = '%{nvcc_path}'
|
||||
NVCC_VERSION = '%{cuda_version}'
|
||||
NVCC_TEMP_DIR = "%{nvcc_tmp_dir}"
|
||||
supported_cuda_compute_capabilities = [ %{cuda_compute_capabilities} ]
|
||||
|
||||
def Log(s):
|
||||
print('gpus/crosstool: {0}'.format(s))
|
||||
|
||||
|
||||
def GetOptionValue(argv, option):
|
||||
"""Extract the list of values for option from options.
|
||||
|
||||
Args:
|
||||
option: The option whose value to extract, without the leading '/'.
|
||||
|
||||
Returns:
|
||||
1. A list of values, either directly following the option,
|
||||
(eg., /opt val1 val2) or values collected from multiple occurrences of
|
||||
the option (eg., /opt val1 /opt val2).
|
||||
2. The leftover options.
|
||||
"""
|
||||
|
||||
parser = ArgumentParser(prefix_chars='/')
|
||||
parser.add_argument('/' + option, nargs='*', action='append')
|
||||
args, leftover = parser.parse_known_args(argv)
|
||||
if args and vars(args)[option]:
|
||||
return (sum(vars(args)[option], []), leftover)
|
||||
return ([], leftover)
|
||||
|
||||
def _update_options(nvcc_options):
|
||||
if NVCC_VERSION in ("7.0",):
|
||||
return nvcc_options
|
||||
|
||||
update_options = { "relaxed-constexpr" : "expt-relaxed-constexpr" }
|
||||
return [ update_options[opt] if opt in update_options else opt
|
||||
for opt in nvcc_options ]
|
||||
|
||||
def GetNvccOptions(argv):
|
||||
"""Collect the -nvcc_options values from argv.
|
||||
|
||||
Args:
|
||||
argv: A list of strings, possibly the argv passed to main().
|
||||
|
||||
Returns:
|
||||
1. The string that can be passed directly to nvcc.
|
||||
2. The leftover options.
|
||||
"""
|
||||
|
||||
parser = ArgumentParser()
|
||||
parser.add_argument('-nvcc_options', nargs='*', action='append')
|
||||
|
||||
args, leftover = parser.parse_known_args(argv)
|
||||
|
||||
if args.nvcc_options:
|
||||
options = _update_options(sum(args.nvcc_options, []))
|
||||
return (['--' + a for a in options], leftover)
|
||||
return ([], leftover)
|
||||
|
||||
|
||||
def InvokeNvcc(argv, log=False):
|
||||
"""Call nvcc with arguments assembled from argv.
|
||||
|
||||
Args:
|
||||
argv: A list of strings, possibly the argv passed to main().
|
||||
log: True if logging is requested.
|
||||
|
||||
Returns:
|
||||
The return value of calling os.system('nvcc ' + args)
|
||||
"""
|
||||
|
||||
src_files = [f for f in argv if
|
||||
re.search('\.cpp$|\.cc$|\.c$|\.cxx$|\.C$', f)]
|
||||
if len(src_files) == 0:
|
||||
raise Error('No source files found for cuda compilation.')
|
||||
|
||||
out_file = [ f for f in argv if f.startswith('/Fo') ]
|
||||
if len(out_file) != 1:
|
||||
raise Error('Please sepecify exactly one output file for cuda compilation.')
|
||||
out = ['-o', out_file[0][len('/Fo'):]]
|
||||
|
||||
nvcc_compiler_options, argv = GetNvccOptions(argv)
|
||||
|
||||
opt_option, argv = GetOptionValue(argv, 'O')
|
||||
opt = ['-g', '-G']
|
||||
if (len(opt_option) > 0 and opt_option[0] != 'd'):
|
||||
opt = ['-O2']
|
||||
|
||||
include_options, argv = GetOptionValue(argv, 'I')
|
||||
includes = ["-I " + include for include in include_options]
|
||||
|
||||
defines, argv = GetOptionValue(argv, 'D')
|
||||
defines = ['-D' + define for define in defines]
|
||||
|
||||
undefines, argv = GetOptionValue(argv, 'U')
|
||||
undefines = ['-U' + define for define in undefines]
|
||||
|
||||
# The rest of the unrecongized options should be passed to host compiler
|
||||
host_compiler_options = [option for option in argv if option not in (src_files + out_file)]
|
||||
|
||||
m_options = ["-m64"]
|
||||
|
||||
nvccopts = ['-D_FORCE_INLINES']
|
||||
for capability in supported_cuda_compute_capabilities:
|
||||
capability = capability.replace('.', '')
|
||||
nvccopts += [r'-gencode=arch=compute_%s,"code=sm_%s,compute_%s"' % (
|
||||
capability, capability, capability)]
|
||||
nvccopts += nvcc_compiler_options
|
||||
nvccopts += undefines
|
||||
nvccopts += defines
|
||||
nvccopts += m_options
|
||||
nvccopts += ['--compiler-options="' + " ".join(host_compiler_options) + '"']
|
||||
nvccopts += ['-x', 'cu'] + opt + includes + out + ['-c'] + src_files
|
||||
# If we don't specify --keep-dir, nvcc will generate intermediate files under TEMP
|
||||
# Put them under NVCC_TEMP_DIR instead, then Bazel can ignore files under NVCC_TEMP_DIR during dependency check
|
||||
# http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#options-for-guiding-compiler-driver
|
||||
# Different actions are sharing NVCC_TEMP_DIR, so we cannot remove it if the directory already exists.
|
||||
if os.path.isfile(NVCC_TEMP_DIR):
|
||||
os.remove(NVCC_TEMP_DIR)
|
||||
if not os.path.exists(NVCC_TEMP_DIR):
|
||||
os.makedirs(NVCC_TEMP_DIR)
|
||||
nvccopts += ['--keep', '--keep-dir', NVCC_TEMP_DIR]
|
||||
cmd = [NVCC_PATH] + nvccopts
|
||||
if log:
|
||||
Log(cmd)
|
||||
proc = subprocess.Popen(cmd,
|
||||
stdout=sys.stdout,
|
||||
stderr=sys.stderr,
|
||||
env=os.environ.copy(),
|
||||
shell=True)
|
||||
proc.wait()
|
||||
return proc.returncode
|
||||
|
||||
def main():
|
||||
parser = ArgumentParser()
|
||||
parser.add_argument('-x', nargs=1)
|
||||
parser.add_argument('--cuda_log', action='store_true')
|
||||
args, leftover = parser.parse_known_args(sys.argv[1:])
|
||||
|
||||
if args.x and args.x[0] == 'cuda':
|
||||
if args.cuda_log: Log('-x cuda')
|
||||
leftover = [pipes.quote(s) for s in leftover]
|
||||
if args.cuda_log: Log('using nvcc')
|
||||
return InvokeNvcc(leftover, log=args.cuda_log)
|
||||
|
||||
# Strip our flags before passing through to the CPU compiler for files which
|
||||
# are not -x cuda. We can't just pass 'leftover' because it also strips -x.
|
||||
# We not only want to pass -x to the CPU compiler, but also keep it in its
|
||||
# relative location in the argv list (the compiler is actually sensitive to
|
||||
# this).
|
||||
cpu_compiler_flags = [flag for flag in sys.argv[1:]
|
||||
if not flag.startswith(('--cuda_log'))
|
||||
and not flag.startswith(('-nvcc_options'))]
|
||||
|
||||
return subprocess.call([CPU_COMPILER] + cpu_compiler_flags)
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main())
|
163
third_party/gpus/cuda/BUILD.windows.tpl
vendored
Normal file
163
third_party/gpus/cuda/BUILD.windows.tpl
vendored
Normal file
@ -0,0 +1,163 @@
|
||||
licenses(["restricted"]) # MPL2, portions GPL v3, LGPL v3, BSD-like
|
||||
|
||||
package(default_visibility = ["//visibility:public"])
|
||||
|
||||
config_setting(
|
||||
name = "using_nvcc",
|
||||
values = {
|
||||
"define": "using_cuda_nvcc=true",
|
||||
},
|
||||
)
|
||||
|
||||
config_setting(
|
||||
name = "using_clang",
|
||||
values = {
|
||||
"define": "using_cuda_clang=true",
|
||||
},
|
||||
)
|
||||
|
||||
# Equivalent to using_clang && -c opt.
|
||||
config_setting(
|
||||
name = "using_clang_opt",
|
||||
values = {
|
||||
"define": "using_cuda_clang=true",
|
||||
"compilation_mode": "opt",
|
||||
},
|
||||
)
|
||||
|
||||
config_setting(
|
||||
name = "darwin",
|
||||
values = {"cpu": "darwin"},
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
config_setting(
|
||||
name = "freebsd",
|
||||
values = {"cpu": "freebsd"},
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "cuda_headers",
|
||||
hdrs = [
|
||||
"cuda/cuda_config.h",
|
||||
%{cuda_headers}
|
||||
],
|
||||
includes = [
|
||||
".",
|
||||
"cuda/include",
|
||||
"cuda/include/crt",
|
||||
],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
cc_import(
|
||||
name = "cudart_static",
|
||||
# /WHOLEARCHIVE:cudart_static.lib will cause a
|
||||
# "Internal error during CImplib::EmitThunk" error.
|
||||
# Treat this library as interface library to avoid being whole archived when
|
||||
# linking a DLL that depends on this.
|
||||
# TODO(pcloudy): Remove this rule after b/111278841 is resolved.
|
||||
interface_library = "cuda/lib/%{cudart_static_lib}",
|
||||
system_provided = 1,
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
cc_import(
|
||||
name = "cuda_driver",
|
||||
interface_library = "cuda/lib/%{cuda_driver_lib}",
|
||||
system_provided = 1,
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
cc_import(
|
||||
name = "cudart",
|
||||
interface_library = "cuda/lib/%{cudart_lib}",
|
||||
system_provided = 1,
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
cc_import(
|
||||
name = "cublas",
|
||||
interface_library = "cuda/lib/%{cublas_lib}",
|
||||
system_provided = 1,
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
cc_import(
|
||||
name = "cusolver",
|
||||
interface_library = "cuda/lib/%{cusolver_lib}",
|
||||
system_provided = 1,
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
cc_import(
|
||||
name = "cudnn",
|
||||
interface_library = "cuda/lib/%{cudnn_lib}",
|
||||
system_provided = 1,
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "cudnn_header",
|
||||
includes = [
|
||||
".",
|
||||
"cuda/include",
|
||||
],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
cc_import(
|
||||
name = "cufft",
|
||||
interface_library = "cuda/lib/%{cufft_lib}",
|
||||
system_provided = 1,
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
cc_import(
|
||||
name = "curand",
|
||||
interface_library = "cuda/lib/%{curand_lib}",
|
||||
system_provided = 1,
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "cuda",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
":cublas",
|
||||
":cuda_headers",
|
||||
":cudart",
|
||||
":cudnn",
|
||||
":cufft",
|
||||
":curand",
|
||||
],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "cupti_headers",
|
||||
hdrs = [
|
||||
"cuda/cuda_config.h",
|
||||
":cuda-extras",
|
||||
],
|
||||
includes = [
|
||||
".",
|
||||
"cuda/extras/CUPTI/include/",
|
||||
],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
cc_import(
|
||||
name = "cupti_dsos",
|
||||
interface_library = "cuda/lib/%{cupti_lib}",
|
||||
system_provided = 1,
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "libdevice_root",
|
||||
data = [":cuda-nvvm"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
%{cuda_include_genrules}
|
2079
third_party/gpus/cuda_configure.bzl
vendored
2079
third_party/gpus/cuda_configure.bzl
vendored
File diff suppressed because it is too large
Load Diff
@ -36,8 +36,6 @@ build:cuda --define=using_cuda=true --define=using_cuda_nvcc=true
|
||||
build:cuda_clang --crosstool_top=@local_config_cuda//crosstool:toolchain
|
||||
build:cuda_clang --define=using_cuda=true --define=using_cuda_clang=true --define=using_clang=true
|
||||
|
||||
build:win-cuda --define=using_cuda=true --define=using_cuda_nvcc=true
|
||||
|
||||
build:mkl --define=using_mkl=true
|
||||
|
||||
build:sycl --crosstool_top=@local_config_sycl//crosstool:toolchain
|
||||
|
Loading…
Reference in New Issue
Block a user