MCPcopy Create free account
hub / github.com/ROCm/clr / captureAndSet

Method captureAndSet

rocclr/platform/kernel.cpp:106–167  ·  view source on GitHub ↗

=================================================================================================

Source from the content-addressed store, hash-verified

104
105// =================================================================================================
106bool KernelParameters::captureAndSet(void** kernelParams, address kernArgs, size_t kernArgsSize,
107 address mem) {
108 amd::Memory** memories = reinterpret_cast<amd::Memory**>(mem + memoryObjOffset());
109 for (size_t idx = 0; idx < signature_.numParameters(); ++idx) {
110 KernelParameterDescriptor& desc = signature_.params()[idx];
111 void* value = kernelParams ? kernelParams[idx] : kernArgs + desc.offset_;
112 void* param = mem + desc.offset_;
113 uint32_t uint32_value = 0;
114 uint64_t uint64_value = 0;
115 // if using the 'extra' path and this parameter lies beyond supplied size, write zero
116 if (kernelParams == nullptr && ((desc.offset_ + desc.size_) > kernArgsSize)) {
117 value = &uint64_value;
118 }
119 Memory* memArg = nullptr;
120 if (desc.type_ == T_POINTER && (desc.addressQualifier_ != CL_KERNEL_ARG_ADDRESS_LOCAL)) {
121 LP64_SWITCH(uint32_value, uint64_value) = *(LP64_SWITCH(uint32_t*, uint64_t*))value;
122 memArg = amd::MemObjMap::FindMemObj(*reinterpret_cast<const void* const*>(value));
123 memories[desc.info_.arrayIndex_] = memArg;
124 if (!(amd::IS_HIP && AMD_DIRECT_DISPATCH)) {
125 if (memArg != nullptr) {
126 memArg->retain();
127 }
128 }
129 } else if (desc.type_ == T_SAMPLER) {
130 LogError("Cannot handle Sampler now");
131 return false;
132 } else if (desc.type_ == T_QUEUE) {
133 LogError("Cannot handle Queue now");
134 return false;
135 } else {
136 switch (desc.size_) {
137 case 4:
138 if (desc.addressQualifier_ == CL_KERNEL_ARG_ADDRESS_LOCAL) {
139 uint32_value = desc.size_;
140 } else {
141 uint32_value = *(static_cast<const uint32_t*>(value));
142 }
143 break;
144 case 8:
145 if (desc.addressQualifier_ == CL_KERNEL_ARG_ADDRESS_LOCAL) {
146 uint64_value = desc.size_;
147 } else {
148 uint64_value = *(static_cast<const uint64_t*>(value));
149 }
150 break;
151 }
152 }
153
154 switch (desc.size_) {
155 case sizeof(uint32_t):
156 *static_cast<uint32_t*>(param) = uint32_value;
157 break;
158 case sizeof(uint64_t):
159 *static_cast<uint64_t*>(param) = uint64_value;
160 break;
161 default:
162 ::memcpy(param, value, desc.size_);
163 break;

Callers 1

Calls 3

memcpyFunction · 0.85
numParametersMethod · 0.80
retainMethod · 0.45

Tested by

no test coverage detected