From 86b7046dde4be2e12f1c0bf063a132f2b4d626c4 Mon Sep 17 00:00:00 2001
From: foreman
Date: Tue, 27 Oct 2015 14:18:47 -0400
Subject: [PATCH] P4 to Git Change 1204387 by ashi1@ashi1_win50 on 2015/10/27
14:09:10
SWDEV-79695 - HSAIL Metadata Workgroup Size Hint and Vec Type Hint added to HSAIL
HSAIL does not handle kernel attributes for work_group_size_hint or vec_type_hint.
Adding these two kernel attributes to metadata requires multiple changes:
HSAIL: Added parsing functions to HSAILParseMetadata.cpp, and similar files
Properly translates to .hsail files as 'wsh' and 'vth'
MDParser: Flex scanner now reads new hsail metadata, 'wsh' and 'vth'
Acl_metadata: added the two new metadata
Uint32_t wsh[3]; // Added case: RT_WORK_GROUP_SIZE_HINT
Char *vth; // Added case: RT_VEC_TYPE_HINT
Since vth is std::string, it was required to serialize, and then de-serialize for aclMetadata
TODO: Runtime changes required for the use of these two metadata:
Runtime's gpukernel.cpp requires 4 new aclQueries during HSAILKernel::Init
Runtime changes are showing issues when testing
Affected files ...
... //depot/stg/opencl/drivers/opencl/compiler/lib/backends/common/v0_8/if_acl.cpp#79 edit
... //depot/stg/opencl/drivers/opencl/compiler/lib/backends/gpu/MDParser/AMDILMDInterface.h#4 edit
... //depot/stg/opencl/drivers/opencl/compiler/lib/backends/gpu/MDParser/AMDILMDParser.l#5 edit
... //depot/stg/opencl/drivers/opencl/compiler/lib/backends/gpu/MDParser/AMDILMDTypes.cpp#4 edit
... //depot/stg/opencl/drivers/opencl/compiler/lib/backends/gpu/MDParser/lex.yy.cpp#6 edit
... //depot/stg/opencl/drivers/opencl/compiler/lib/backends/gpu/metadata.cpp#10 edit
... //depot/stg/opencl/drivers/opencl/compiler/lib/include/v0_8/aclEnums.h#24 edit
... //depot/stg/opencl/drivers/opencl/compiler/lib/include/v0_8/aclStructs.h#19 edit
... //depot/stg/opencl/drivers/opencl/compiler/llvm/lib/Target/HSAIL/HSAILKernel.h#13 edit
... //depot/stg/opencl/drivers/opencl/compiler/llvm/lib/Target/HSAIL/HSAILKernelManager.cpp#38 edit
... //depot/stg/opencl/drivers/opencl/compiler/llvm/lib/Target/HSAIL/HSAILModuleInfo.cpp#16 edit
... //depot/stg/opencl/drivers/opencl/compiler/llvm/lib/Target/HSAIL/HSAILParseMetadata.cpp#14 edit
... //depot/stg/opencl/drivers/opencl/tests/ocltst/module/complib/CLAssumptionCheck.cpp#45 edit
... //depot/stg/opencl/drivers/opencl/tests/ocltst/module/complib/CLEnumCheck.cpp#49 edit
---
.../lib/backends/common/v0_8/if_acl.cpp | 33 ++++++++++++++++++-
rocclr/compiler/lib/include/v0_8/aclEnums.h | 4 ++-
rocclr/compiler/lib/include/v0_8/aclStructs.h | 3 ++
3 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp b/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp
index 98b080787e..49ba01f7fb 100644
--- a/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp
+++ b/rocclr/compiler/lib/backends/common/v0_8/if_acl.cpp
@@ -2356,6 +2356,10 @@ void deserializeCLMetadata(const char* ptr, aclMetadata * const md, const size_t
md->deviceName = tmp_ptr;
tmp_ptr += md->deviceNameSize + 1;
+ // de-serialize the vec type hint
+ md->vth = tmp_ptr;
+ tmp_ptr += md->vecTypeHintSize + 1;
+
// de-serailize the arguments
md->args = reinterpret_cast(tmp_ptr);
tmp_ptr += (md->numArgs + 1) * sizeof(aclArgData);
@@ -2825,7 +2829,34 @@ if_aclQueryInfo(aclCompiler *cl,
}
break;
}
- }
+ case RT_WORK_GROUP_SIZE_HINT: {
+ size_t work_group_size_hint_size = sizeof(md->wsh);
+ if (!ptr) {
+ *size = work_group_size_hint_size;
+ success = true;
+ } else if (*size >= work_group_size_hint_size) {
+ memcpy(ptr, md->wsh, work_group_size_hint_size);
+ success = true;
+ }
+ break;
+ }
+ case RT_VEC_TYPE_HINT: {
+ if (!ptr) {
+ *size = md->vecTypeHintSize;
+ success = true;
+ } else if (*size >= md->vecTypeHintSize) {
+ // vecTypeHint is a pointer, which is serialized by serializeMetadata() to NULL
+ // in binary; to get the data deserializeCLMetadata() is needed
+ aclMetadata *deserializedMd = static_cast(alloca(roSize));
+ deserializeCLMetadata(reinterpret_cast(roSec), deserializedMd, roSize);
+ if (deserializedMd->vth && deserializedMd->vecTypeHintSize == md->vecTypeHintSize) {
+ strncpy(reinterpret_cast(ptr), deserializedMd->vth, deserializedMd->vecTypeHintSize);
+ success = true;
+ }
+ }
+ break;
+ }
+ }
return (success) ? ACL_SUCCESS : ACL_ERROR;
}
static unsigned getSize(aclArgDataType data)
diff --git a/rocclr/compiler/lib/include/v0_8/aclEnums.h b/rocclr/compiler/lib/include/v0_8/aclEnums.h
index 25264ada80..928cd048fc 100644
--- a/rocclr/compiler/lib/include/v0_8/aclEnums.h
+++ b/rocclr/compiler/lib/include/v0_8/aclEnums.h
@@ -218,7 +218,9 @@ typedef enum _rt_query_types_enum_0_8 {
RT_NUM_KERNEL_HIDDEN_ARGS = 22,
RT_CONTAINS_SPIRV = 23,
RT_WAVES_PER_SIMD_HINT = 24,
- RT_LAST_TYPE = 25
+ RT_WORK_GROUP_SIZE_HINT = 25,
+ RT_VEC_TYPE_HINT = 26,
+ RT_LAST_TYPE = 27
} aclQueryType_0_8;
//! An enumeration for the various GPU capabilities
diff --git a/rocclr/compiler/lib/include/v0_8/aclStructs.h b/rocclr/compiler/lib/include/v0_8/aclStructs.h
index 0e648669b9..42206cb1fd 100644
--- a/rocclr/compiler/lib/include/v0_8/aclStructs.h
+++ b/rocclr/compiler/lib/include/v0_8/aclStructs.h
@@ -121,6 +121,9 @@ typedef struct _acl_metadata_0_8 {
uint32_t kernel_index; // RT_KERNEL_INDEX
uint32_t numHiddenKernelArgs; // RT_NUM_KERNEL_HIDDEN_ARGS
uint32_t wavesPerSimdHint; // RT_WAVES_PER_SIMD_HINT
+ uint32_t wsh[3]; // RT_WORK_GROUP_SIZE_HINT
+ size_t vecTypeHintSize;
+ const char *vth; // RT_VEC_TYPE_HINT
} aclMetadata_0_8;
//! An structure that holds information on the capabilities of the bif device.