JuliaLang / julia

The Julia Programming Language
https://julialang.org/
MIT License
45.47k stars 5.46k forks source link

Fatal error on multi-threaded code processing image files #32939

Open nlw0 opened 5 years ago

nlw0 commented 5 years ago

The following script processes a couple of images with some file I/O. Running it with @threads causes a failure. It always breaks when calling the script directly with JULIA_NUM_THREADS>1 , though when includeing it in a running session it seems it breaks the first time and later it works.

Am I wrong in assuming this code is thread-safe in the first place, or could this be a bug somewhere?

using FileIO
using Images

imgs = [
"https://images.unsplash.com/photo-1554266183-2696fdafe3ff?ixlib=rb-1.2.1&auto=format&fit=crop&w=564&q=80"
"https://images.unsplash.com/photo-1527026950045-9e066846bae4?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1419&q=80"
"https://images.unsplash.com/photo-1549287748-f095932c9f81?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=606&q=80"
"https://images.unsplash.com/photo-1437448317784-3a480be9571e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=634&q=80"
]

files = download.(imgs)

Threads.@threads for f in files
    a = load(f)
    r = rand(eltype(a), size(a)...)
    a .= map(clamp01nan, a + 0.5*r)
    save(f*".png", a)
end

The error:

$ JULIA_NUM_THREADS=4 julia mycode.jl
Error encountered while loading "/tmp/jl_5OG85C".
Fatal error:
Error encountered while loading "/tmp/jl_hZpwGF".
Fatal error:
Error encountered while loading "/tmp/jl_BlmZ9H".
Fatal error:
ERROR: LoadError: concurrency violation detected
Stacktrace:
 [1] try_yieldto(::typeof(Base.ensure_rescheduled), ::Base.RefValue{Task}) at ./task.jl:552
 [2] wait() at ./task.jl:609
 [3] wait(::Base.GenericCondition{Base.Threads.SpinLock}) at ./condition.jl:107
 [4] wait(::Task) at ./task.jl:214
 [5] top-level scope at ./threadingconstructs.jl:75
 [6] include at ./boot.jl:328 [inlined]
 [7] include_relative(::Module, ::String) at ./loading.jl:1094
 [8] include(::Module, ::String) at ./Base.jl:31
 [9] exec_options(::Base.JLOptions) at ./client.jl:295
 [10] _start() at ./client.jl:468
in expression starting at /home/user/src/julia-test/mycode.jl:13
julia> versioninfo()
Julia Version 1.3.0-alpha.1
Commit f2513a8ca6* (2019-07-23 05:06 UTC)
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-6.0.1 (ORCJIT, skylake)
Environment:
  JULIA_NUM_THREADS = 4
  JULIA_EDITOR = emacsclient
islent commented 4 years ago

Got same problem here. I was doing something like:

Threads.@threads for i in 0:99
    ...
    data = read_jld(filename, i)
    ...
end

It works as long as I remove Threads.@threads

The error output:

Error encountered while loading "F:\\JuliaAstroSim\\output\\snapshot_00013.jld2".

Fatal error:
Error encountered while loading "F:\\JuliaAstroSim\\output\\snapshot_00039.jld2".

Fatal error:
Error encountered while loading "F:\\JuliaAstroSim\\output\\snapshot_00026.jld2".

Fatal error:
Error encountered while loading "F:\\JuliaAstroSim\\output\\snapshot_00064.jld2".

Fatal error:

Please submit a bug report with steps to reproduce this fault, and any error messages that follow (in their entirety). Thanks.
Exception: EXCEPTION_ACCESS_VIOLATION at 0x668b7755 -- jl_gc_pool_alloc at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gc.c:1102
in expression starting at REPL[1]:1
jl_gc_pool_alloc at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gc.c:1101
InferenceResult at .\compiler\inferenceresult.jl:13 [inlined]
InferenceResult at .\compiler\inferenceresult.jl:12 [inlined]
typeinf_ext at .\compiler\typeinfer.jl:572
typeinf_ext at .\compiler\typeinfer.jl:605
jfptr_typeinf_ext_1.clone_1 at F:\Julia-1.3.0\lib\julia\sys.dll (unknown line)
jl_apply_generic at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:2135 [inlined]
jl_apply at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\julia.h:1631 [inlined]
jl_type_infer at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:209
jl_compile_method_internal at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:1879
_jl_invoke at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:2140 [inlined]
jl_apply_generic at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:2305
jl_apply at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\julia.h:1631 [inlined]
jl_f__apply at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\builtins.c:627
handle_exceptions at C:\Users\islent\.julia\packages\FileIO\BcdlR\src\error_handling.jl:77
#load#27 at C:\Users\islent\.julia\packages\FileIO\BcdlR\src\loadsave.jl:189
load at C:\Users\islent\.julia\packages\FileIO\BcdlR\src\loadsave.jl:169 [inlined]
#load#13 at C:\Users\islent\.julia\packages\FileIO\BcdlR\src\loadsave.jl:118 [inlined]
load at C:\Users\islent\.julia\packages\FileIO\BcdlR\src\loadsave.jl:118 [inlined]
read_jld at C:\Users\islent\.julia\packages\AstroIO\EBwxn\src\JLD2.jl:17 [inlined]
macro expansion at F:\JuliaAstroSim\AstroPlot.jl\src\snapshots\trajectory.jl:43 [inlined]
#54#threadsfor_fun at .\threadingconstructs.jl:61
#54#threadsfor_fun at .\threadingconstructs.jl:28
_jl_invoke at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:2135 [inlined]
jl_apply_generic at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:2305
jl_apply at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\julia.h:1631 [inlined]
start_task at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\task.c:659
Allocations: 75863940 (Pool: 75848305; Big: 15635); GC: 69

Please submit a bug report with steps to reproduce this fault, and any error messages that follow (in their entirety). Thanks.
Exception: EXCEPTION_ACCESS_VIOLATION at 0x668b7e06 -- jl_gc_pool_alloc at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gc.c:1102 [inlined]
jl_gc_alloc_ at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\julia_internal.h:233 [inlined]
jl_gc_alloc at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gc.c:2940
in expression starting at REPL[1]:1
jl_gc_pool_alloc at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gc.c:1101 [inlined]
jl_gc_alloc_ at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\julia_internal.h:233 [inlined]
jl_gc_alloc at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gc.c:2940
jl_alloc_svec_uninit at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\simplevector.c:60 [inlined]
jl_svec at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\simplevector.c:15
ml_matches_visitor at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:2647
jl_typemap_intersection_node_visitor at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\typemap.c:475
ml_matches at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:2706
cache_method at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:948
cache_method at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:1106 [inlined]
jl_mt_assoc_by_type at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:1106
jl_apply_generic at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:2272
_atexit at .\initdefs.jl:309
jfptr__atexit_12546.clone_1 at F:\Julia-1.3.0\lib\julia\sys.dll (unknown line)
_jl_invoke at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:2135 [inlined]
jl_apply_generic at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:2305
jl_apply at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\julia.h:1631 [inlined]
jl_atexit_hook at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\init.c:242
jl_exit at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\jl_uv.c:629
jl_exception_handler at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\signals-win.c:308
__julia_personality at /cygdrive/d/buildbot/worker/package_win64/build/src/support/cygdrive/d/buildbot/worker/package_win64/build/src/support\win32_ucontext.c:28
_chkstk at C:\WINDOWS\SYSTEM32\ntdll.dll (unknown line)
RtlRaiseException at C:\WINDOWS\SYSTEM32\ntdll.dll (unknown line)
KiUserExceptionDispatcher at C:\WINDOWS\SYSTEM32\ntdll.dll (unknown line)
jl_gc_pool_alloc at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gc.c:1101
InferenceResult at .\compiler\inferenceresult.jl:13 [inlined]
InferenceResult at .\compiler\inferenceresult.jl:12 [inlined]
typeinf_ext at .\compiler\typeinfer.jl:572
typeinf_ext at .\compiler\typeinfer.jl:605
jfptr_typeinf_ext_1.clone_1 at F:\Julia-1.3.0\lib\julia\sys.dll (unknown line)
jl_apply_generic at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:2135 [inlined]
jl_apply at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\julia.h:1631 [inlined]
jl_type_infer at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:209
jl_compile_method_internal at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:1879
_jl_invoke at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:2140 [inlined]
jl_apply_generic at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:2305
jl_apply at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\julia.h:1631 [inlined]
jl_f__apply at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\builtins.c:627
handle_exceptions at C:\Users\islent\.julia\packages\FileIO\BcdlR\src\error_handling.jl:77
#load#27 at C:\Users\islent\.julia\packages\FileIO\BcdlR\src\loadsave.jl:189
load at C:\Users\islent\.julia\packages\FileIO\BcdlR\src\loadsave.jl:169 [inlined]
#load#13 at C:\Users\islent\.julia\packages\FileIO\BcdlR\src\loadsave.jl:118 [inlined]
load at C:\Users\islent\.julia\packages\FileIO\BcdlR\src\loadsave.jl:118 [inlined]
read_jld at C:\Users\islent\.julia\packages\AstroIO\EBwxn\src\JLD2.jl:17 [inlined]
macro expansion at F:\JuliaAstroSim\AstroPlot.jl\src\snapshots\trajectory.jl:43 [inlined]
#54#threadsfor_fun at .\threadingconstructs.jl:61
#54#threadsfor_fun at .\threadingconstructs.jl:28
_jl_invoke at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:2135 [inlined]
jl_apply_generic at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\gf.c:2305
jl_apply at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\julia.h:1631 [inlined]
start_task at /cygdrive/d/buildbot/worker/package_win64/build/src/cygdrive/d/buildbot/worker/package_win64/build/src\task.c:659
Allocations: 75863940 (Pool: 75848305; Big: 15635); GC: 69
julia> versioninfo()
Julia Version 1.3.0
Commit 46ce4d7933 (2019-11-26 06:09 UTC)        
Platform Info:
  OS: Windows (x86_64-w64-mingw32)
  CPU: Intel(R) Core(TM) i7-4940MX CPU @ 3.10GHz
  WORD_SIZE: 64    
  LIBM: libopenlibm
  LLVM: libLLVM-6.0.1 (ORCJIT, haswell)
Environment:
  JULIA_NUM_THREADS = 8