Summary: | lang/beignet: crashes with some OpenCL apps | ||
---|---|---|---|
Product: | Ports & Packages | Reporter: | Jan Beich <jbeich> |
Component: | Individual Port(s) | Assignee: | freebsd-x11 (Nobody) <x11> |
Status: | Closed FIXED | ||
Severity: | Affects Only Me | CC: | dim, jbeich, toolchain, xiuli.pan |
Priority: | --- | Keywords: | needs-qa |
Version: | Latest | Flags: | bugzilla:
maintainer-feedback?
(x11) |
Hardware: | Any | ||
OS: | Any |
Description
Jan Beich
![]() ![]() One of graphics/piglit tests fails the same way as multimedia/libx264: $ /usr/local/lib/piglit/bin/cl-api-enqueue-fill-image ## Test: clEnqueueFillImage (/usr/ports/graphics/piglit/work/piglit-ca5350b4056ae63a93c4c207087b7634873b2ce2/tests/cl/api/enqueue-fill-image.c) ## # Running on: # Platform: Intel Gen OCL Driver # Device: Intel(R) HD Graphics Skylake Desktop GT2 # OpenCL version: 1.2 Unresolved symbol: _Z22__gen_ocl_write_imagef11ocl_image2dDv2_iDv4_f Aborting... While deleting: <2 x i32> % Use still stuck around after Def is destroyed: tail call void @_Z22__gen_ocl_write_imagef11ocl_image2dDv2_iDv4_f(%opencl.image2d_t.0 addrspace(1)* %image, <2 x i32> <badref>, <4 x float> %pattern) #6 Assertion failed: (use_empty() && "Uses remain when a value is destroyed!"), function ~Value, file /usr/ports/devel/llvm37/work/llvm-3.7.1.src/lib/IR/Value.cpp, line 82. I can still reproduce on drm-next from 2017-03-07 (be99d136554) and beignet-1.3.0. $ /usr/local/lib/piglit/bin/cl-api-enqueue-fill-image ## Test: clEnqueueFillImage (/wrkdirs/usr/ports/graphics/piglit/work/piglit-ca5350b4056ae63a93c4c207087b7634873b2ce2/tests/cl/api/enqueue-fill-image.c) ## # Running on: # Platform: Intel Gen OCL Driver # Device: Intel(R) HD Graphics Skylake Desktop GT2 # OpenCL version: 1.2 Unresolved symbol: _Z22__gen_ocl_write_imagef14ocl_image2d_woDv2_iDv4_f Aborting... While deleting: <2 x i32> % Use still stuck around after Def is destroyed: tail call void @_Z22__gen_ocl_write_imagef14ocl_image2d_woDv2_iDv4_f(%opencl.image2d_wo_t.0 addrspace(1)* %image, <2 x i32> <badref>, <4 x float> %pattern) #4 Assertion failed: (use_empty() && "Uses remain when a value is destroyed!"), function ~Value, file /tmp/a/overlay/ports/devel/llvm39/work/llvm-3.9.1.src/lib/IR/Value.cpp, line 85. $ waifu2x-converter-cpp --processor 1 -i miku_CC_BY-NC_noisy.jpg Unresolved symbol: _Z14__gen_ocl_fmaxff Aborting... [...] Segmentation fault * thread #1, stop reason = signal SIGSEGV: invalid address (fault address: 0xae40003) frame #0: 0x000000080dab7084 libgbe.so`llvm::LLVMContext::removeModule(llvm::Module*) + 4 libgbe.so`llvm::LLVMContext::removeModule: -> 0x80dab7084 <+4>: movq (%rdi), %rdi 0x80dab7087 <+7>: popq %rbp 0x80dab7088 <+8>: jmp 0x80db6a460 ; llvm::SmallPtrSetImplBase::erase_imp(void const*) 0x80dab708d: nop (lldb) bt * thread #1, stop reason = signal SIGSEGV: invalid address (fault address: 0xae40003) * frame #0: 0x000000080dab7084 libgbe.so`llvm::LLVMContext::removeModule(llvm::Module*) + 4 frame #1: 0x000000080dae8cbf libgbe.so`llvm::Module::~Module(void) + 31 frame #2: libgbe.so`gbe::Program::buildFromLLVMFile(this=0x000000080ae1fcb0, fileName=0x0000000000000000, module=0x000000080af42c00, error=0x00007fffffff4b48, optLevel=1) at program.cpp:177 frame #3: libgbe.so`gbe::genProgramNewFromLLVM(deviceID=6418, fileName=0x0000000000000000, module=0x000000080af42c00, llvm_ctx=0x000000080ae4c460, asm_file_name=0x0000000000000000, stringSize=1048576, err="", errSize=0x000000080ae57368, optLevel=1, options="") at gen_program.cpp:459 frame #4: libgbe.so`gbe::programNewFromSource(deviceID=6418, source="https://github.com/tanakamura/waifu2x-converter-cpp/blob/master/src/modelHandler_OpenCL.cl", stringSize=1048576, options="", err="", errSize=0x000000080ae57368) at program.cpp:1111 frame #5: libcl.so`cl_program_build(p=0x000000080ae572a0, options="") at cl_program.c:625 frame #6: libcl.so`clBuildProgram(program=0x000000080ae572a0, num_devices=1, device_list=0x00007fffffff5648, options="", pfn_notify=0x0000000000000000, user_data=0x0000000000000000) at cl_api.c:835 frame #7: libOpenCL.so.1`clBuildProgram(program=0x000000080ae572a0, num_devices=1, device_list=0x00007fffffff5648, options="", pfn_notify=0x0000000000000000, user_data=0x0000000000000000) at ocl_icd_loader_gen.c:387 frame #8: libw2xc.so`w2xc::initOpenCL(c=0x000000080ae5f0a0, env=0x000000080ae462f8, proc=0x000000080af29908) at modelHandler_OpenCL.cpp:361 frame #9: libw2xc.so`::w2xconv_init_with_processor(processor_idx=1, nJob=8, enable_log=1) at w2xconv.cpp:379 frame #10: waifu2x-converter-cpp`main(argc=5, argv=0x00007fffffffe3e0) at main.cpp:185 frame #11: waifu2x-converter-cpp`_start(ap=<unavailable>, cleanup=<unavailable>) at crt1.c:72 $ ffmpeg -hide_banner -i Samsung_UHD_7Wonders_of_the_World_Italy.ts -x264opts opencl:opencl-device=0 -codec:v libx264 -y /tmp/a.mp4 [mpegts @ 0x80ac54000] start time for stream 1 is not set in estimate_timings_from_pts [mpegts @ 0x80ac54000] Could not find codec parameters for stream 1 (Audio: aac ([15][0][0][0] / 0x000F), 0 channels, fltp): unspecified sample rate Consider increasing the value for the 'analyzeduration' and 'probesize' options Input #0, mpegts, from '/p/Samsung_UHD_7Wonders_of_the_World_Italy.ts': Duration: 00:02:12.28, start: 1.050044, bitrate: 51922 kb/s Program 1 Stream #0:0[0x101]: Video: hevc (Main 10) ([36][0][0][0] / 0x0024), yuv420p10le(tv), 3840x2160 [SAR 1:1 DAR 16:9], 59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc Stream #0:1[0x102](und): Audio: aac ([15][0][0][0] / 0x000F), 0 channels, fltp [libx264 @ 0x80ac18d00] using SAR=1/1 [libx264 @ 0x80ac18d00] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 AVX2 LZCNT BMI2 [libx264 @ 0x80ac18d00] OpenCL acceleration enabled with Intel Intel(R) HD Graphics Skylake Desktop GT2 [libx264 @ 0x80ac18d00] Compiling OpenCL kernels... Unresolved symbol: _Z23__gen_ocl_write_imageui14ocl_image2d_woDv2_iDv4_j Aborting... Unresolved symbol: _Z22__gen_ocl_read_imageui14ocl_image2d_ro11ocl_samplerDv2_fj Aborting... [...] Segmentation fault * thread #1, stop reason = signal SIGSEGV: invalid address (fault address: 0x18) frame #0: libgbe.so`llvm::Value::getValueID(this=0x0000000000000000) const at Value.h:425 422 /// # the InstructionVal enumerator must be the highest valued enumerator in 423 /// the ValueTy enum. 424 unsigned getValueID() const { -> 425 return SubclassID; 426 } 427 428 /// \brief Return the raw optional flags value contained in this value. (lldb) bt * thread #1, stop reason = signal SIGSEGV: invalid address (fault address: 0x18) * frame #0: libgbe.so`llvm::Value::getValueID(this=0x0000000000000000) const at Value.h:425 frame #1: libgbe.so`llvm::isa_impl<llvm::Instruction, llvm::Value, void>::doit(Val=0x0000000000000000) at Value.h:734 frame #2: libgbe.so`llvm::isa_impl_cl<llvm::Instruction, llvm::Value const*>::doit(Val=0x0000000000000000) at Casting.h:96 frame #3: libgbe.so`llvm::isa_impl_wrap<llvm::Instruction, llvm::Value const*, llvm::Value const*>::doit(Val=0x00007fffffff6db0) at Casting.h:122 frame #4: libgbe.so`llvm::isa_impl_wrap<llvm::Instruction, llvm::Value* const, llvm::Value const*>::doit(Val=0x00007fffffff6df8) at Casting.h:112 frame #5: libgbe.so`bool llvm::isa<llvm::Instruction, llvm::Value*>(Val=0x00007fffffff6df8) at Casting.h:133 frame #6: libgbe.so`llvm::cast_retty<llvm::Instruction, llvm::Value*>::ret_type llvm::dyn_cast<llvm::Instruction, llvm::Value>(Val=0x0000000000000000) at Casting.h:298 frame #7: libgbe.so`gbe::Scalarize::scalarizeExtract(this=0x000000080ac5c7c0, extr=0x000000080b3517e0) at llvm_scalarize.cpp:824 frame #8: libgbe.so`gbe::Scalarize::scalarize(this=0x000000080ac5c7c0, inst=0x000000080b3517e0) at llvm_scalarize.cpp:517 frame #9: libgbe.so`gbe::Scalarize::runOnFunction(this=0x000000080ac5c7c0, F=0x000000080ba39848)at llvm_scalarize.cpp:905 frame #10: 0x0000000850ec799c libgbe.so`llvm::FPPassManager::runOnFunction(llvm::Function&) + 540 frame #11: 0x0000000850cb06b4 libgbe.so`(anonymous namespace)::CGPassManager::runOnModule(llvm::Module&) + 1412 frame #12: 0x0000000850ec815c libgbe.so`llvm::legacy::PassManagerImpl::run(llvm::Module&) + 988 frame #13: libgbe.so`gbe::llvmToGen(unit=0x000000080dba6780, fileName=0x0000000000000000, module=0x000000080aff5300, optLevel=1, strictMath=true, profiling=0, errors=0x00007fffffff9748) at llvm_to_gen.cpp:409 frame #14: libgbe.so`gbe::Program::buildFromLLVMFile(this=0x000000080adeb150, fileName=0x0000000000000000, module=0x000000080aff5f00, error=0x00007fffffff9748, optLevel=1) at program.cpp:146 frame #15: libgbe.so`gbe::genProgramNewFromLLVM(deviceID=6418, fileName=0x0000000000000000, module=0x000000080aff5f00, llvm_ctx=0x000000080ac44568, asm_file_name=0x0000000000000000, stringSize=1048576, err="", errSize=0x000000080acd7fa8, optLevel=1, options="") at gen_program.cpp:459 frame #16: libgbe.so`gbe::programNewFromSource(deviceID=6418, source="http://sprunge.us/iSib", stringSize=1048576, options="", err="", errSize=0x000000080acd7fa8)at program.cpp:1111 frame #17: libcl.so`cl_program_build(p=0x000000080acd7ee0, options="") at cl_program.c:625 frame #18: libcl.so`clBuildProgram(program=0x000000080acd7ee0, num_devices=1, device_list=0x000000080dbbd6b8, options="", pfn_notify=0x0000000000000000, user_data=0x0000000000000000) at cl_api.c:835 frame #19: libOpenCL.so.1`clBuildProgram(program=0x000000080acd7ee0, num_devices=1, device_list=0x000000080dbbd6b8, options="", pfn_notify=0x0000000000000000, user_data=0x0000000000000000) at ocl_icd_loader_gen.c:387 frame #20: libx264.so.148`x264_opencl_compile(h=0x000000080dbb1720) at opencl.c:277 frame #21: libx264.so.148`x264_opencl_lookahead_alloc(h=0x000000080dbb1720) at opencl.c:363 frame #22: libx264.so.148`x264_opencl_lookahead_init(h=0x000000080dbb1720) at opencl.c:543 frame #23: libx264.so.148`x264_encoder_open_148(param=0x000000080ac55208) at encoder.c:1674 frame #24: 0x000000080121e5ee libavcodec.so.57`X264_init + 4190 frame #25: 0x00000008014b75d0 libavcodec.so.57`avcodec_open2 + 5072 frame #26: 0x000000000022a498 ffmpeg`transcode + 4440 frame #27: 0x0000000000228ac1 ffmpeg`main + 3169 frame #28: ffmpeg`_start(ap=<unavailable>, cleanup=<unavailable>) at crt1.c:72 Hi, I am Xiuli form the Beignet team and I have seen some patch to our mail-list and found there are some bugs here. These bugs seems to be some conflict about the llvm version. LLVM has a mangle change in LLVM39, if you get some binary build with LLVM39 and have some lower verison CLANG when runing. There maybe some bugs like this. So could you provide the clang -v output to check the LLVM version. Thanks Xiuli (In reply to Xiuli Pan from comment #3) > These bugs seems to be some conflict about the llvm version. LLVM has a mangle > change in LLVM39, if you get some binary build with LLVM39 and have some lower > verison CLANG when runing. There maybe some bugs like this. Thank you for the hint. Beignet works fine after a small fix[1] but I haven't tested much. [1] https://lists.freedesktop.org/archives/beignet/2017-March/008702.html > So could you provide the clang -v output to check the LLVM version. FreeBSD has one Clang version in base and many more suffixed in ports/packages. lang/beignet port passes -DLLVM_CONFIG_EXECUTABLE=/usr/local/bin/llvm-config39 which ends up building some (but not all) files with clang39. However, even forcing to build everything with clang39 doesn't help. $ clang -v FreeBSD clang version 4.0.0 (tags/RELEASE_400/final 297347) (based on LLVM 4.0.0) Target: x86_64-unknown-freebsd12.0 Thread model: posix InstalledDir: /usr/bin $ clang39 -v clang version 3.9.1 (tags/RELEASE_391/final) Target: x86_64-unknown-freebsd12.0 Thread model: posix InstalledDir: /usr/local/llvm39/bin (In reply to Jan Beich (mail not working) from comment #4) OK, it seems you have already root cause it, I will review you patch then. Thanks Xiuli libcxxrt behavior doesn't even match libcxxabi (from LLVM). I've filed a bug: https://github.com/pathscale/libcxxrt/issues/46 A commit references this bug: Author: dim Date: Wed Mar 22 21:45:42 UTC 2017 New revision: 315745 URL: https://svnweb.freebsd.org/changeset/base/315745 Log: Cherry-pick libcxxrt commit 8a853717e61d5d55cbdf74d9d0a7545da5d5ff92: Author: David Chisnall <theraven@FreeBSD.org> Date: Wed Mar 22 12:27:08 2017 +0000 Simplify some code. realloc() with a null pointer is equivalent to malloc, so we don't need to handle the two cases independently. Fixes #46 This should help with lang/beignet and other programs, which expect __cxa_demangle(name, NULL, NULL, &status) to return zero in status. PR: 213732 MFC after: 3 days Changes: head/contrib/libcxxrt/typeinfo.cc I will close this after r315745 has been MFCd. A commit references this bug: Author: dim Date: Sat Mar 25 12:29:15 UTC 2017 New revision: 315943 URL: https://svnweb.freebsd.org/changeset/base/315943 Log: MFC r315745: Cherry-pick libcxxrt commit 8a853717e61d5d55cbdf74d9d0a7545da5d5ff92: Author: David Chisnall <theraven@FreeBSD.org> Date: Wed Mar 22 12:27:08 2017 +0000 Simplify some code. realloc() with a null pointer is equivalent to malloc, so we don't need to handle the two cases independently. Fixes #46 This should help with lang/beignet and other programs, which expect __cxa_demangle(name, NULL, NULL, &status) to return zero in status. PR: 213732 Changes: _U stable/10/ stable/10/contrib/libcxxrt/typeinfo.cc _U stable/11/ stable/11/contrib/libcxxrt/typeinfo.cc _U stable/9/ _U stable/9/contrib/ _U stable/9/contrib/libcxxrt/ stable/9/contrib/libcxxrt/typeinfo.cc |