From 0c2f7255ceebf1fa32a4496ce686bf26a11f046d Mon Sep 17 00:00:00 2001 From: Jonathan Charest Date: Mon, 15 Jul 2013 15:58:46 -0400 Subject: [PATCH 1/2] Added missing address space checking of kernel parameters (thanks to tstellar for pointing me in the right direction). Signed-off-by: Jonathan Charest --- .../state_trackers/clover/llvm/invocation.cpp | 31 ++++++++++++++-------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index dae61f7..5cb5724 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -113,7 +114,7 @@ namespace { llvm::Module * compile(const std::string &source, const std::string &name, const std::string &triple, const std::string &processor, - const std::string &opts) { + const std::string &opts, clang::LangAS::Map& address_spaces) { clang::CompilerInstance c; clang::CompilerInvocation invocation; @@ -204,6 +205,9 @@ namespace { if (!c.ExecuteAction(act)) throw build_error(log); + // Get address spaces map to be able to find kernel argument address spaces + memcpy(address_spaces, c.getTarget().getAddressSpaceMap(), sizeof(address_spaces)); + return act.takeModule(); } @@ -282,7 +286,8 @@ namespace { module build_module_llvm(llvm::Module *mod, - const std::vector &kernels) { + const std::vector &kernels, + clang::LangAS::Map& address_spaces) { module m; struct pipe_llvm_program_header header; @@ -318,14 +323,17 @@ namespace { } if (arg_type->isPointerTy()) { - // XXX: Figure out LLVM->OpenCL address space mappings for each - // target. I think we need to ask clang what these are. For now, - // pretend everything is in the global address space. unsigned address_space = llvm::cast(arg_type)->getAddressSpace(); - switch (address_space) { - default: - args.push_back(module::argument(module::argument::global, arg_size)); - break; + if (address_space == + address_spaces[clang::LangAS::opencl_local - clang::LangAS::Offset]) { + args.push_back(module::argument(module::argument::local, arg_size)); + } + else if (address_space == + address_spaces[clang::LangAS::opencl_constant - clang::LangAS::Offset]) { + args.push_back(module::argument(module::argument::constant, arg_size)); + } + else { + args.push_back(module::argument(module::argument::global, arg_size)); } } else { args.push_back(module::argument(module::argument::scalar, arg_size)); @@ -358,10 +366,11 @@ clover::compile_program_llvm(const compat::string &source, std::string processor(target.begin(), 0, processor_str_len); std::string triple(target.begin(), processor_str_len + 1, target.size() - processor_str_len - 1); + clang::LangAS::Map address_spaces; // The input file name must have the .cl extension in order for the // CompilerInvocation class to recognize it as an OpenCL source file. - llvm::Module *mod = compile(source, "input.cl", triple, processor, opts); + llvm::Module *mod = compile(source, "input.cl", triple, processor, opts, address_spaces); find_kernels(mod, kernels); @@ -374,6 +383,6 @@ clover::compile_program_llvm(const compat::string &source, assert(0); return module(); default: - return build_module_llvm(mod, kernels); + return build_module_llvm(mod, kernels, address_spaces); } } -- 1.8.3.2 From 3ba0ab9edf94c887ce96abc4643cfe480a4cbd4e Mon Sep 17 00:00:00 2001 From: Jonathan Charest Date: Tue, 16 Jul 2013 11:07:15 -0400 Subject: [PATCH 2/2] Added local argument size to lds size Size must be in dw Signed-off-by: Jonathan Charest --- src/gallium/drivers/r600/evergreen_compute.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c index f76fc9c..9b2bae3 100644 --- a/src/gallium/drivers/r600/evergreen_compute.c +++ b/src/gallium/drivers/r600/evergreen_compute.c @@ -211,8 +211,7 @@ void *evergreen_create_compute_state( #endif shader->ctx = (struct r600_context*)ctx; - /* XXX: We ignore cso->req_local_mem, because we compute this value - * ourselves on a per-kernel basis. */ + shader->local_size = cso->req_local_mem; shader->private_size = cso->req_private_mem; shader->input_size = cso->req_input_mem; @@ -334,7 +333,7 @@ static void evergreen_emit_direct_dispatch( unsigned wave_divisor = (16 * num_pipes); int group_size = 1; int grid_size = 1; - unsigned lds_size = shader->active_kernel->bc.nlds_dw; + unsigned lds_size = shader->local_size / 4 + shader->active_kernel->bc.nlds_dw; /* Calculate group_size/grid_size */ for (i = 0; i < 3; i++) { -- 1.8.3.2