Tom Stellard <t...@stellard.net> writes: > On Thu, May 15, 2014 at 10:42:07PM +0200, Francisco Jerez wrote: >> Tom Stellard <t...@stellard.net> writes: >> >> > On Thu, May 15, 2014 at 06:22:11PM +0200, Francisco Jerez wrote: >> >> Bruno Jimenez <brunoji...@gmail.com> writes: >> >> >> >> > Hi, >> >> > >> >> > I'm trying to make clover fail in the case that a kernel fails to build. >> >> > My first attempt has been to track a llvm compile failure up from >> >> > 'radeon_llvm_compile' (at radeon/radeon_llvm_emit.c), through >> >> > 'r600_llvm_compile' (at r600/r600_llvm.c) and through >> >> > 'evergreen_launch_grid' (at r600/evergreen_compute.c), then detect the >> >> > failure when launching a kernel and throw an error. >> >> > >> >> > The attached patch is based on this, and it kind of works, as for the >> >> > first kernel that fails to compile it will return the corresponding >> >> > error (CL_INVALID_PROGRAM_EXECUTABLE), but for the following kernels it >> >> > crashes completely. >> >> > >> >> > I think that this is not how we should detect compile errors, nor where >> >> > we should. Because, after reading the OpenCL 1.1 spec, I think that they >> >> > should be handled at 'clBuildProgram'. >> >> > >> >> > The spec for OpenCL 1.1 says about 'clBuildProgram': >> >> > 'builds (compiles & links) a program executable [...]' >> >> > And there's an error for build failures: >> >> > 'CL_BUILD_PROGRAM_FAILURE if there is a failure to build the program >> >> > executable' >> >> > >> >> > Any thoughts about this? >> >> >> >> Yeah... I think you're right and this is a dead end, it's probably not >> >> the way we should handle this situation. Compiler errors should be >> >> returned from the compiler, not from launch_grid(). This is likely to >> >> be an LLVM back-end bug. Clang shouldn't return successfully if the >> >> program is malformed and the pipe driver won't be able to deal with the >> >> generated code. If the fact that clover::compile_program_llvm() doesn't >> >> detect the failure is caused by radeon's two-step compilation process, I >> >> guess that this is another reason to refactor the radeon compiler code >> >> so the whole compilation happens in one step from the LLVM back-end and >> >> most of what radeon_llvm_compile() does now is handled from within clang >> >> as it's called from clover::compile_program_llvm(), which would generate >> >> machine code directly instead of LLVM IR. >> >> >> > >> > I've mostly implemented moving the compilation phase into clover, but it is >> > dependent on this patch: >> > http://lists.freedesktop.org/archives/mesa-dev/2014-March/055424.html >> > until function calls are implemented, which may be a while. >> > >> >> I don't think that patch would be required in principle if the function >> inlining is taken care of by the LLVM back-end instead as we discussed >> earlier. >> > > The reason I've avoided doing this in the backend is that this would > require re-running all the optimizations which would really hurt compile > time. However, I think I am OK with having non-optimized inline > functions, since the regular inliner will inline small functions anyway. > This will motivate me to complete function call support. >
Until you support actual function calls, couldn't you implement the same mechanism as a target-specific function pass run before the function inliner? (e.g. adding it to the pass manager from AMDGPUTargetMachine::addAnalysisPasses) >> > Is there some other way to handle this? Maybe a flag on struct >> > pipe_compute_state? >> > >> >> I guess another possibility would be to have clang run the necessary >> checks somehow so we can be sure that a successful compilation implies >> that the generated code is well-formed and the second compilation is >> going to complete successfully too. >> > > This would work, but I think I prefer your original idea. > > -Tom > >> Thanks. >> >> > -Tom >> > >> >> Thanks. >> >> >> >> > Bruno >> >> > From e92bc2804b60ebb69268b02df7f57301aea8b20b Mon Sep 17 00:00:00 2001 >> >> > From: =?UTF-8?q?Bruno=20Jim=C3=A9nez?= <brunoji...@gmail.com> >> >> > Date: Wed, 14 May 2014 17:04:50 +0200 >> >> > Subject: [PATCH] exit if llvm_compile fails >> >> > >> >> > --- >> >> > src/gallium/drivers/ilo/ilo_gpgpu.c | 2 +- >> >> > src/gallium/drivers/nouveau/nvc0/nvc0_compute.c | 2 +- >> >> > src/gallium/drivers/nouveau/nvc0/nvc0_context.h | 8 ++++---- >> >> > src/gallium/drivers/nouveau/nvc0/nve4_compute.c | 2 +- >> >> > src/gallium/drivers/r600/evergreen_compute.c | 12 ++++++++---- >> >> > src/gallium/drivers/radeonsi/si_compute.c | 2 +- >> >> > src/gallium/include/pipe/p_context.h | 6 +++--- >> >> > src/gallium/state_trackers/clover/core/kernel.cpp | 14 +++++++++----- >> >> > 8 files changed, 28 insertions(+), 20 deletions(-) >> >> > >> >> > diff --git a/src/gallium/drivers/ilo/ilo_gpgpu.c >> >> > b/src/gallium/drivers/ilo/ilo_gpgpu.c >> >> > index b17a518..19990fc 100644 >> >> > --- a/src/gallium/drivers/ilo/ilo_gpgpu.c >> >> > +++ b/src/gallium/drivers/ilo/ilo_gpgpu.c >> >> > @@ -32,7 +32,7 @@ >> >> > * This is a placeholder. We will need something similar to >> >> > ilo_3d_pipeline. >> >> > */ >> >> > >> >> > -static void >> >> > +static unsigned >> >> > ilo_launch_grid(struct pipe_context *pipe, >> >> > const uint *block_layout, const uint *grid_layout, >> >> > uint32_t pc, const void *input) >> >> > diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_compute.c >> >> > b/src/gallium/drivers/nouveau/nvc0/nvc0_compute.c >> >> > index ad287a2..26ace0a 100644 >> >> > --- a/src/gallium/drivers/nouveau/nvc0/nvc0_compute.c >> >> > +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_compute.c >> >> > @@ -193,7 +193,7 @@ nvc0_compute_upload_input(struct nvc0_context >> >> > *nvc0, const void *input) >> >> > } >> >> > } >> >> > >> >> > -void >> >> > +unsigned >> >> > nvc0_launch_grid(struct pipe_context *pipe, >> >> > const uint *block_layout, const uint *grid_layout, >> >> > uint32_t label, >> >> > diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h >> >> > b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h >> >> > index 76416a0..b1bbc54 100644 >> >> > --- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h >> >> > +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h >> >> > @@ -349,11 +349,11 @@ nvc0_video_buffer_create(struct pipe_context >> >> > *pipe, >> >> > void nvc0_push_vbo(struct nvc0_context *, const struct pipe_draw_info >> >> > *); >> >> > >> >> > /* nve4_compute.c */ >> >> > -void nve4_launch_grid(struct pipe_context *, >> >> > - const uint *, const uint *, uint32_t, const void >> >> > *); >> >> > +unsigned nve4_launch_grid(struct pipe_context *, >> >> > + const uint *, const uint *, uint32_t, const >> >> > void *); >> >> > >> >> > /* nvc0_compute.c */ >> >> > -void nvc0_launch_grid(struct pipe_context *, >> >> > - const uint *, const uint *, uint32_t, const void >> >> > *); >> >> > +unsigned nvc0_launch_grid(struct pipe_context *, >> >> > + const uint *, const uint *, uint32_t, const >> >> > void *); >> >> > >> >> > #endif >> >> > diff --git a/src/gallium/drivers/nouveau/nvc0/nve4_compute.c >> >> > b/src/gallium/drivers/nouveau/nvc0/nve4_compute.c >> >> > index f243316..593d455 100644 >> >> > --- a/src/gallium/drivers/nouveau/nvc0/nve4_compute.c >> >> > +++ b/src/gallium/drivers/nouveau/nvc0/nve4_compute.c >> >> > @@ -428,7 +428,7 @@ nve4_compute_alloc_launch_desc(struct >> >> > nouveau_context *nv, >> >> > return (struct nve4_cp_launch_desc *)ptr; >> >> > } >> >> > >> >> > -void >> >> > +unsigned >> >> > nve4_launch_grid(struct pipe_context *pipe, >> >> > const uint *block_layout, const uint *grid_layout, >> >> > uint32_t label, >> >> > diff --git a/src/gallium/drivers/r600/evergreen_compute.c >> >> > b/src/gallium/drivers/r600/evergreen_compute.c >> >> > index 701bb5c..305bd84 100644 >> >> > --- a/src/gallium/drivers/r600/evergreen_compute.c >> >> > +++ b/src/gallium/drivers/r600/evergreen_compute.c >> >> > @@ -538,7 +538,7 @@ void evergreen_emit_cs_shader( >> >> > RADEON_PRIO_SHADER_DATA)); >> >> > } >> >> > >> >> > -static void evergreen_launch_grid( >> >> > +static unsigned evergreen_launch_grid( >> >> > struct pipe_context *ctx_, >> >> > const uint *block_layout, const uint *grid_layout, >> >> > uint32_t pc, const void *input) >> >> > @@ -550,6 +550,8 @@ static void evergreen_launch_grid( >> >> > >> >> > COMPUTE_DBG(ctx->screen, "*** evergreen_launch_grid: pc = >> >> > %u\n", pc); >> >> > >> >> > + shader->active_kernel = kernel; >> >> > + ctx->cs_shader_state.kernel_index = pc; >> >> > #ifdef HAVE_OPENCL >> >> > >> >> > if (!kernel->code_bo) { >> >> > @@ -566,7 +568,9 @@ static void evergreen_launch_grid( >> >> > ctx->screen->has_compressed_msaa_texturing); >> >> > bc->type = TGSI_PROCESSOR_COMPUTE; >> >> > bc->isa = ctx->isa; >> >> > - r600_llvm_compile(mod, ctx->b.family, bc, &use_kill, >> >> > dump); >> >> > + >> >> > + if (r600_llvm_compile(mod, ctx->b.family, bc, >> >> > &use_kill, dump)) >> >> > + return 1; >> >> > >> >> > if (dump && !sb_disasm) { >> >> > r600_bytecode_disasm(bc); >> >> > @@ -582,10 +586,10 @@ static void evergreen_launch_grid( >> >> > ctx->b.ws->buffer_unmap(kernel->code_bo->cs_buf); >> >> > } >> >> > #endif >> >> > - shader->active_kernel = kernel; >> >> > - ctx->cs_shader_state.kernel_index = pc; >> >> > evergreen_compute_upload_input(ctx_, block_layout, grid_layout, >> >> > input); >> >> > compute_emit_cs(ctx, block_layout, grid_layout); >> >> > + >> >> > + return 0; >> >> > } >> >> > >> >> > static void evergreen_set_compute_resources(struct pipe_context * ctx_, >> >> > diff --git a/src/gallium/drivers/radeonsi/si_compute.c >> >> > b/src/gallium/drivers/radeonsi/si_compute.c >> >> > index c0637f6..4ff7f7a 100644 >> >> > --- a/src/gallium/drivers/radeonsi/si_compute.c >> >> > +++ b/src/gallium/drivers/radeonsi/si_compute.c >> >> > @@ -117,7 +117,7 @@ static void si_set_global_binding( >> >> > } >> >> > } >> >> > >> >> > -static void si_launch_grid( >> >> > +static unsigned si_launch_grid( >> >> > struct pipe_context *ctx, >> >> > const uint *block_layout, const uint *grid_layout, >> >> > uint32_t pc, const void *input) >> >> > diff --git a/src/gallium/include/pipe/p_context.h >> >> > b/src/gallium/include/pipe/p_context.h >> >> > index bc43530..0fa9278 100644 >> >> > --- a/src/gallium/include/pipe/p_context.h >> >> > +++ b/src/gallium/include/pipe/p_context.h >> >> > @@ -520,9 +520,9 @@ struct pipe_context { >> >> > * should point to a buffer of at least >> >> > * pipe_compute_state::req_input_mem bytes. >> >> > */ >> >> > - void (*launch_grid)(struct pipe_context *context, >> >> > - const uint *block_layout, const uint >> >> > *grid_layout, >> >> > - uint32_t pc, const void *input); >> >> > + unsigned (*launch_grid)(struct pipe_context *context, >> >> > + const uint *block_layout, const uint >> >> > *grid_layout, >> >> > + uint32_t pc, const void *input); >> >> > /*@}*/ >> >> > >> >> > /** >> >> > diff --git a/src/gallium/state_trackers/clover/core/kernel.cpp >> >> > b/src/gallium/state_trackers/clover/core/kernel.cpp >> >> > index 5e5fe51..5517b17 100644 >> >> > --- a/src/gallium/state_trackers/clover/core/kernel.cpp >> >> > +++ b/src/gallium/state_trackers/clover/core/kernel.cpp >> >> > @@ -70,6 +70,7 @@ kernel::launch(command_queue &q, >> >> > const auto reduced_grid_size = >> >> > map(divides(), grid_size, block_size); >> >> > void *st = exec.bind(&q); >> >> > + unsigned err; >> >> > >> >> > // The handles are created during exec_context::bind(), so we need >> >> > make >> >> > // sure to call exec_context::bind() before retrieving them. >> >> > @@ -89,11 +90,11 @@ kernel::launch(command_queue &q, >> >> > q.pipe->set_global_binding(q.pipe, 0, exec.g_buffers.size(), >> >> > exec.g_buffers.data(), g_handles.data()); >> >> > >> >> > - q.pipe->launch_grid(q.pipe, >> >> > - pad_vector(q, block_size, 1).data(), >> >> > - pad_vector(q, reduced_grid_size, 1).data(), >> >> > - find(name_equals(_name), m.syms).offset, >> >> > - exec.input.data()); >> >> > + err = q.pipe->launch_grid(q.pipe, >> >> > + pad_vector(q, block_size, 1).data(), >> >> > + pad_vector(q, reduced_grid_size, >> >> > 1).data(), >> >> > + find(name_equals(_name), m.syms).offset, >> >> > + exec.input.data()); >> >> > >> >> > q.pipe->set_global_binding(q.pipe, 0, exec.g_buffers.size(), NULL, >> >> > NULL); >> >> > q.pipe->set_compute_resources(q.pipe, 0, exec.resources.size(), >> >> > NULL); >> >> > @@ -102,6 +103,9 @@ kernel::launch(command_queue &q, >> >> > q.pipe->bind_sampler_states(q.pipe, PIPE_SHADER_COMPUTE, 0, >> >> > exec.samplers.size(), NULL); >> >> > exec.unbind(); >> >> > + >> >> > + if (err) >> >> > + throw error(CL_INVALID_PROGRAM_EXECUTABLE); >> >> > } >> >> > >> >> > size_t >> >> > -- >> >> > 1.9.2 >> > >> > >> > >> > >> >> _______________________________________________ >> >> mesa-dev mailing list >> >> mesa-dev@lists.freedesktop.org >> >> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
pgpjULnpVQs_W.pgp
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev