Files
Keno FischerandClaude Fable 5 7a07c8e1f4 Add an asynchronous cancellation API for in-flight operations
Long-running BLAS calls (a large gemm can run for minutes) cannot
currently be interrupted: callers embedding OpenBLAS (e.g. the Julia
runtime responding to a user's ^C) can only wait for completion or kill
the process. Add a minimal cooperative cancellation protocol:

Every thread owns a pointer-sized generation slot in thread-local
storage, whose stable address is returned by openblas_cancel_token().
Instrumented compute drivers advance the slot to a fresh even
generation at operation entry on the issuing thread (forwarding the
slot and generation to worker threads through blas_arg_t) and poll it
at block granularity. openblas_cancel(token, loaded_token) - callable
from any thread - sets the cancel bit (bit 0) iff the slot still holds
loaded_token, so a canceller that loaded the value while an operation
was in flight stops exactly that operation, while stale or racing
requests either miss or dirty an already-dead generation, both
harmless. There is no object lifecycle: nothing to allocate, bind,
reset, or free.

A cancelled operation returns quickly, leaving its output buffer in an
unspecified partially-updated state that the caller must discard; every
synchronization point in the threaded driver is still executed, so
sibling threads never stall and the library remains consistent for
subsequent calls. Coverage: the level-3 gemm/symm/hemm drivers
(level3.c and level3_thread.c).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012nCkyKUguncLLJrH9K5o7m
2026-07-19 04:20:28 +00:00

297 lines
7.3 KiB
Makefile

TOPDIR = ../..
include ../../Makefile.system
COMMONOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) c_abs.$(SUFFIX) z_abs.$(SUFFIX) openblas_set_num_threads.$(SUFFIX) openblas_get_num_threads.$(SUFFIX) openblas_get_num_procs.$(SUFFIX) openblas_get_config.$(SUFFIX) openblas_get_parallel.$(SUFFIX) openblas_error_handle.$(SUFFIX) openblas_env.$(SUFFIX) openblas_cancel.$(SUFFIX) blas_server_callback.$(SUFFIX)
#COMMONOBJS += slamch.$(SUFFIX) slamc3.$(SUFFIX) dlamch.$(SUFFIX) dlamc3.$(SUFFIX)
ifdef SMP
COMMONOBJS += blas_server.$(SUFFIX) divtable.$(SUFFIX) blasL1thread.$(SUFFIX)
ifneq ($(NO_AFFINITY), 1)
COMMONOBJS += init.$(SUFFIX)
endif
endif
# COMMONOBJS += info.$(SUFFIX)
ifeq ($(DYNAMIC_ARCH), 1)
ifeq ($(ARCH),arm64)
COMMONOBJS += dynamic_arm64.$(SUFFIX)
else
ifeq ($(ARCH),power)
COMMONOBJS += dynamic_power.$(SUFFIX)
else
ifeq ($(ARCH),zarch)
COMMONOBJS += dynamic_zarch.$(SUFFIX)
else
ifeq ($(ARCH),mips64)
COMMONOBJS += dynamic_mips64.$(SUFFIX)
else
ifeq ($(ARCH),loongarch64)
COMMONOBJS += dynamic_loongarch64.$(SUFFIX)
else
ifeq ($(ARCH),riscv64)
COMMONOBJS += dynamic_riscv64.$(SUFFIX) detect_riscv64.$(SUFFIX)
else
COMMONOBJS += dynamic.$(SUFFIX)
endif
endif
endif
endif
endif
endif
else
COMMONOBJS += parameter.$(SUFFIX)
endif
ifeq ($(EXPRECISION), 1)
COMMONOBJS += x_abs.$(SUFFIX) qlamch.$(SUFFIX) qlamc3.$(SUFFIX)
endif
ifeq ($(QUAD_PRECISION), 1)
COMMONOBJS += addx.$(SUFFIX) mulx.$(SUFFIX)
endif
ifeq ($(OSNAME), CYGWIN_NT)
ifeq ($(C_COMPILER), PGI)
# COMMONOBJS += __builtin_stinit.$(SUFFIX)
endif
endif
ifeq ($(USE_CUDA), 1)
COMMONOBJS += cuda_init.$(SUFFIX)
endif
ifdef FUNCTION_PROFILE
COMMONOBJS += profile.$(SUFFIX)
endif
LIBOTHERS = libothers.$(LIBSUFFIX)
ifeq ($(CORE), PPC440)
MEMORY = memory_qalloc.c
endif
ifndef MEMORY
MEMORY = memory.c
endif
ifeq ($(USE_OPENMP), 1)
BLAS_SERVER = blas_server_omp.c
else
ifeq ($(OSNAME), WINNT)
BLAS_SERVER = blas_server_win32.c
endif
ifeq ($(OSNAME), CYGWIN_NT)
BLAS_SERVER = blas_server_win32.c
endif
ifeq ($(OSNAME), Interix)
BLAS_SERVER = blas_server_win32.c
endif
endif
ifndef BLAS_SERVER
BLAS_SERVER = blas_server.c
endif
ifeq ($(DYNAMIC_ARCH), 1)
ifeq ($(ARCH),arm64)
HPLOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) dynamic_arm64.$(SUFFIX)
else
ifeq ($(ARCH),power)
HPLOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) dynamic_power.$(SUFFIX)
else
ifeq ($(ARCH),zarch)
HPLOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) dynamic_zarch.$(SUFFIX)
else
ifeq ($(ARCH),mips64)
HPLOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) dynamic_mips64.$(SUFFIX)
else
ifeq ($(ARCH),loongarch64)
HPLOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) dynamic_loongarch64.$(SUFFIX)
else
ifeq ($(ARCH),riscv64)
HPLOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) dynamic_riscv64.$(SUFFIX) detect_riscv64.$(SUFFIX)
else
HPLOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) dynamic.$(SUFFIX)
endif
endif
endif
endif
endif
endif
else
HPLOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) parameter.$(SUFFIX)
endif
xerbla.$(SUFFIX) : xerbla.c
$(CC) $(CFLAGS) -c $< -o $(@F)
dynamic%$(SUFFIX) : dynamic%c
$(CC) $(CFLAGS) -c $< -o $(@F)
dynamic%$(PSUFFIX) : dynamic%c
$(CC) $(PFLAGS) -c $< -o $(@F)
parameter.$(SUFFIX) : parameter.c ../../param.h
$(CC) $(CFLAGS) -c $< -o $(@F)
init.$(SUFFIX) : init.c
$(CC) $(CFLAGS) -c $< -o $(@F)
profile.$(SUFFIX) : profile.c
$(CC) $(CFLAGS) -c $< -o $(@F)
memory.$(SUFFIX) : $(MEMORY) ../../common.h ../../param.h
$(CC) $(CFLAGS) -c $< -o $(@F)
blas_server.$(SUFFIX) : $(BLAS_SERVER) ../../common.h ../../common_thread.h ../../param.h
$(CC) $(CFLAGS) -c $< -o $(@F)
blas_server_callback.$(SUFFIX) : blas_server_callback.c ../../common.h
$(CC) $(CFLAGS) -c $< -o $(@F)
openblas_set_num_threads.$(SUFFIX) : openblas_set_num_threads.c
$(CC) $(CFLAGS) -c $< -o $(@F)
openblas_get_num_threads.$(SUFFIX) : openblas_get_num_threads.c
$(CC) $(CFLAGS) -c $< -o $(@F)
openblas_get_num_procs.$(SUFFIX) : openblas_get_num_procs.c
$(CC) $(CFLAGS) -c $< -o $(@F)
openblas_get_config.$(SUFFIX) : openblas_get_config.c
$(CC) $(CFLAGS) -c $< -o $(@F)
openblas_get_parallel.$(SUFFIX) : openblas_get_parallel.c
$(CC) $(CFLAGS) -c $< -o $(@F)
openblas_error_handle.$(SUFFIX) : openblas_error_handle.c
$(CC) $(CFLAGS) -c $< -o $(@F)
openblas_env.$(SUFFIX) : openblas_env.c
$(CC) $(CFLAGS) -c $< -o $(@F)
openblas_cancel.$(SUFFIX) : openblas_cancel.c ../../common.h
$(CC) $(CFLAGS) -c $< -o $(@F)
blasL1thread.$(SUFFIX) : blas_l1_thread.c ../../common.h ../../common_thread.h
$(CC) $(CFLAGS) -c $< -o $(@F)
cuda_init.$(SUFFIX) : cuda_init.c
$(CUCC) $(COMMON_OPT) -I$(TOPDIR) $(CUFLAGS) -DCNAME=$(*F) -c $< -o $(@F)
c_abs.$(SUFFIX) : abs.c
$(CC) $(CFLAGS) -c -UDOUBLE $< -o $(@F)
z_abs.$(SUFFIX) : abs.c
$(CC) $(CFLAGS) -c -DDOUBLE $< -o $(@F)
x_abs.$(SUFFIX) : abs.c
$(CC) $(CFLAGS) -c -DXDOUBLE $< -o $(@F)
slamch.$(SUFFIX) : lamch.c
$(CC) $(CFLAGS) -c -UDOUBLE $< -o $(@F)
dlamch.$(SUFFIX) : lamch.c
$(CC) $(CFLAGS) -c -DDOUBLE $< -o $(@F)
qlamch.$(SUFFIX) : lamch.c
$(CC) $(CFLAGS) -c -DXDOUBLE $< -o $(@F)
slamc3.$(SUFFIX) : lamc3.c
$(CC) $(CFLAGS) -c -UDOUBLE $< -o $(@F)
dlamc3.$(SUFFIX) : lamc3.c
$(CC) $(CFLAGS) -c -DDOUBLE $< -o $(@F)
qlamc3.$(SUFFIX) : lamc3.c
$(CC) $(CFLAGS) -c -DXDOUBLE $< -o $(@F)
divtable.$(SUFFIX) : divtable.c
$(CC) $(CFLAGS) -c -UDOUBLE $< -o $(@F)
__builtin_stinit.$(SUFFIX) : $(ARCH)/builtin_stinit.S
$(CC) $(CFLAGS) -c -UDOUBLE $< -o $(@F)
addx.$(SUFFIX) : $(ARCH)/addx.c
$(CC) $(CFLAGS) -c -DXDOUBLE -UCOMPLEX $< -o $(@F)
mulx.$(SUFFIX) : $(ARCH)/mulx.c
$(CC) $(CFLAGS) -c -DXDOUBLE -UCOMPLEX $< -o $(@F)
detect_riscv64.$(SUFFIX): detect_riscv64.c
$(CC) $(CFLAGS) -c -march=rv64imafdcv $< -o $(@F)
xerbla.$(PSUFFIX) : xerbla.c
$(CC) $(PFLAGS) -c $< -o $(@F)
parameter.$(PSUFFIX) : parameter.c ../../param.h
$(CC) $(PFLAGS) -c $< -o $(@F)
init.$(PSUFFIX) : init.c
$(CC) $(PFLAGS) -c $< -o $(@F)
profile.$(PSUFFIX) : profile.c
$(CC) $(PFLAGS) -c $< -o $(@F)
memory.$(PSUFFIX) : $(MEMORY) ../../common.h ../../param.h
$(CC) $(PFLAGS) -c $< -o $(@F)
blas_server.$(PSUFFIX) : $(BLAS_SERVER) ../../common.h ../../common_thread.h
$(CC) $(PFLAGS) -c $< -o $(@F)
blasL1thread.$(PSUFFIX) : blas_l1_thread.c ../../common.h ../../common_thread.h
$(CC) $(PFLAGS) -c $< -o $(@F)
cuda_init.$(PSUFFIX) : cuda_init.c
$(CUCC) $(COMMON_OPT) -I$(TOPDIR) $(CUFLAGS) -DCNAME=$(*F) -c $< -o $(@F)
c_abs.$(PSUFFIX) : abs.c
$(CC) $(PFLAGS) -c -UDOUBLE $< -o $(@F)
z_abs.$(PSUFFIX) : abs.c
$(CC) $(PFLAGS) -c -DDOUBLE $< -o $(@F)
x_abs.$(PSUFFIX) : abs.c
$(CC) $(PFLAGS) -c -DXDOUBLE $< -o $(@F)
slamch.$(PUFFIX) : lamch.c
$(CC) $(PFLAGS) -c -UDOUBLE $< -o $(@F)
dlamch.$(PUFFIX) : lamch.c
$(CC) $(PFLAGS) -c -DDOUBLE $< -o $(@F)
qlamch.$(PUFFIX) : lamch.c
$(CC) $(PFLAGS) -c -DXDOUBLE $< -o $(@F)
slamc3.$(PUFFIX) : lamc3.c
$(CC) $(PFLAGS) -c -UDOUBLE $< -o $(@F)
dlamc3.$(PUFFIX) : lamc3.c
$(CC) $(PFLAGS) -c -DDOUBLE $< -o $(@F)
qlamc3.$(PUFFIX) : lamc3.c
$(CC) $(PFLAGS) -c -DXDOUBLE $< -o $(@F)
divtable.$(PSUFFIX) : divtable.c
$(CC) $(PFLAGS) -c -UDOUBLE $< -o $(@F)
__builtin_stinit.$(PPSUFFIX) : $(ARCH)/builtin_stinit.S
$(CC) $(PFLAGS) -c -UDOUBLE $< -o $(@F)
addx.$(PSUFFIX) : $(ARCH)/addx.c
$(CC) $(PFLAGS) -c -DXDOUBLE -UCOMPLEX $< -o $(@F)
mulx.$(PSUFFIX) : $(ARCH)/mulx.c
$(CC) $(PFLAGS) -c -DXDOUBLE -UCOMPLEX $< -o $(@F)
info.$(SUFFIX) : info.c info.h ../../common.h ../../param.h
$(CC) $(CFLAGS) -c $< -o $(@F)
hpl : override CFLAGS += -DHPL
hpl_p : override CFLAGS += -DHPL
include $(TOPDIR)/Makefile.tail