[Mesa-dev] [PATCH] radv: add a workaround for DXVK hangs by setting amdgpu-skip-threshold
Samuel Pitoiset
samuel.pitoiset at gmail.com
Fri Jun 8 10:19:41 UTC 2018
On 06/08/2018 12:16 PM, Grazvydas Ignotas wrote:
> I haven't tried it, but maybe calling LLVMParseCommandLineOptions()
> second time would work (after creating the target machine, through
> call_once) to avoid all this code duplication?
Maybe, yes.
>
> GraÅžvydas
>
> On Fri, Jun 8, 2018 at 12:38 PM, Samuel Pitoiset
> <samuel.pitoiset at gmail.com> wrote:
>> Workaround for bug in llvm that causes the GPU to hang in presence
>> of nested loops because there is an exec mask issue. The proper
>> solution is to fix LLVM but this might require a bunch of work.
>>
>> This fixes a bunch of GPU hangs that happen with DXVK.
>>
>> Vega10:
>> Totals from affected shaders:
>> SGPRS: 110456 -> 110456 (0.00 %)
>> VGPRS: 122800 -> 122800 (0.00 %)
>> Spilled SGPRs: 7478 -> 7478 (0.00 %)
>> Spilled VGPRs: 36 -> 36 (0.00 %)
>> Code Size: 9901104 -> 9922928 (0.22 %) bytes
>> Max Waves: 7143 -> 7143 (0.00 %)
>>
>> Code size slightly increases because it inserts more branch
>> instructions but that's expected. I don't see any real performance
>> changes.
>>
>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105613
>> Cc: mesa-stable at lists.freedesktop.org
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> ---
>> src/amd/vulkan/radv_shader.c | 79 +++++++++++++++++++++++++++++++++++-
>> 1 file changed, 78 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
>> index 68f2a55e81..76790a1904 100644
>> --- a/src/amd/vulkan/radv_shader.c
>> +++ b/src/amd/vulkan/radv_shader.c
>> @@ -36,6 +36,7 @@
>>
>> #include <llvm-c/Core.h>
>> #include <llvm-c/TargetMachine.h>
>> +#include <llvm-c/Support.h>
>>
>> #include "sid.h"
>> #include "gfx9d.h"
>> @@ -467,6 +468,82 @@ radv_fill_shader_variant(struct radv_device *device,
>> memcpy(ptr, binary->code, binary->code_size);
>> }
>>
>> +static void radv_init_llvm_target()
>> +{
>> + LLVMInitializeAMDGPUTargetInfo();
>> + LLVMInitializeAMDGPUTarget();
>> + LLVMInitializeAMDGPUTargetMC();
>> + LLVMInitializeAMDGPUAsmPrinter();
>> +
>> + /* For inline assembly. */
>> + LLVMInitializeAMDGPUAsmParser();
>> +
>> + /* Workaround for bug in llvm 4.0 that causes image intrinsics
>> + * to disappear.
>> + * https://reviews.llvm.org/D26348
>> + *
>> + * Workaround for bug in llvm that causes the GPU to hang in presence
>> + * of nested loops because there is an exec mask issue. The proper
>> + * solution is to fix LLVM but this might require a bunch of work.
>> + * https://bugs.llvm.org/show_bug.cgi?id=37744
>> + *
>> + * "mesa" is the prefix for error messages.
>> + */
>> + const char *argv[3] = { "mesa", "-simplifycfg-sink-common=false",
>> + "-amdgpu-skip-threshold=1" };
>> + LLVMParseCommandLineOptions(3, argv, NULL);
>> +}
>> +
>> +static once_flag radv_init_llvm_target_once_flag = ONCE_FLAG_INIT;
>> +
>> +static LLVMTargetRef radv_get_llvm_target(const char *triple)
>> +{
>> + LLVMTargetRef target = NULL;
>> + char *err_message = NULL;
>> +
>> + call_once(&radv_init_llvm_target_once_flag, radv_init_llvm_target);
>> +
>> + if (LLVMGetTargetFromTriple(triple, &target, &err_message)) {
>> + fprintf(stderr, "Cannot find target for triple %s ", triple);
>> + if (err_message) {
>> + fprintf(stderr, "%s\n", err_message);
>> + }
>> + LLVMDisposeMessage(err_message);
>> + return NULL;
>> + }
>> + return target;
>> +}
>> +
>> +static LLVMTargetMachineRef radv_create_target_machine(enum radeon_family family,
>> + enum ac_target_machine_options tm_options,
>> + const char **out_triple)
>> +{
>> + assert(family >= CHIP_TAHITI);
>> + char features[256];
>> + const char *triple = (tm_options & AC_TM_SUPPORTS_SPILL) ? "amdgcn-mesa-mesa3d" : "amdgcn--";
>> + LLVMTargetRef target = radv_get_llvm_target(triple);
>> +
>> + snprintf(features, sizeof(features),
>> + "+DumpCode,+vgpr-spilling,-fp32-denormals,+fp64-denormals%s%s%s%s",
>> + tm_options & AC_TM_SISCHED ? ",+si-scheduler" : "",
>> + tm_options & AC_TM_FORCE_ENABLE_XNACK ? ",+xnack" : "",
>> + tm_options & AC_TM_FORCE_DISABLE_XNACK ? ",-xnack" : "",
>> + tm_options & AC_TM_PROMOTE_ALLOCA_TO_SCRATCH ? ",-promote-alloca" : "");
>> +
>> + LLVMTargetMachineRef tm = LLVMCreateTargetMachine(
>> + target,
>> + triple,
>> + ac_get_llvm_processor_name(family),
>> + features,
>> + LLVMCodeGenLevelDefault,
>> + LLVMRelocDefault,
>> + LLVMCodeModelDefault);
>> +
>> + if (out_triple)
>> + *out_triple = triple;
>> + return tm;
>> +}
>> +
>> static struct radv_shader_variant *
>> shader_variant_create(struct radv_device *device,
>> struct radv_shader_module *module,
>> @@ -501,7 +578,7 @@ shader_variant_create(struct radv_device *device,
>> tm_options |= AC_TM_SUPPORTS_SPILL;
>> if (device->instance->perftest_flags & RADV_PERFTEST_SISCHED)
>> tm_options |= AC_TM_SISCHED;
>> - tm = ac_create_target_machine(chip_family, tm_options, NULL);
>> + tm = radv_create_target_machine(chip_family, tm_options, NULL);
>>
>> if (gs_copy_shader) {
>> assert(shader_count == 1);
>> --
>> 2.17.1
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list