SWDEV-301667 - Kernelarg gpuvm

Add aligned, nontemporal `memcpy` for kernarg.

Change-Id: I5d8ac76904feaf793b45ec2ea5fbd1069be20068
Этот коммит содержится в:
Alex Voicu
2023-05-15 22:12:19 +01:00
коммит произвёл Alexandru Voicu
родитель feb22250f3
Коммит 06df9e2efd
2 изменённых файлов: 43 добавлений и 3 удалений
+42 -2
Просмотреть файл
@@ -43,6 +43,7 @@
#include <string>
#include <thread>
#include <vector>
#include <immintrin.h>
/**
@@ -2783,6 +2784,44 @@ bool VirtualGPU::createVirtualQueue(uint deviceQueueSize)
return true;
}
// ================================================================================================
__attribute__((optimize("unroll-all-loops"), always_inline))
static void nontemporalMemcpy(void* __restrict dst, const void* __restrict src,
uint16_t size) {
#if defined(__AVX512F__)
for (auto i = 0u; i != size / sizeof(__m512i); ++i) {
_mm512_stream_si512(reinterpret_cast<__m512i* __restrict&>(dst)++,
*reinterpret_cast<const __m512i* __restrict&>(src)++);
}
size = size % sizeof(__m512i);
#endif
#if defined(__AVX__)
for (auto i = 0u; i != size / sizeof(__m256i); ++i) {
_mm256_stream_si256(reinterpret_cast<__m256i* __restrict&>(dst)++,
*reinterpret_cast<const __m256i* __restrict&>(src)++);
}
size = size % sizeof(__m256i);
#endif
for (auto i = 0u; i != size / sizeof(__m128i); ++i) {
_mm_stream_si128(reinterpret_cast<__m128i* __restrict&>(dst)++,
*(reinterpret_cast<const __m128i* __restrict&>(src)++));
}
size = size % sizeof(__m128i);
for (auto i = 0u; i != size / sizeof(long long); ++i) {
_mm_stream_si64(reinterpret_cast<long long* __restrict&>(dst)++,
*reinterpret_cast<const long long* __restrict&>(src)++);
}
size = size % sizeof(long long);
for (auto i = 0u; i != size / sizeof(int); ++i) {
_mm_stream_si32(reinterpret_cast<int* __restrict&>(dst)++,
*reinterpret_cast<const int* __restrict&>(src)++);
}
}
// ================================================================================================
bool VirtualGPU::submitKernelInternal(const amd::NDRangeContainer& sizes,
const amd::Kernel& kernel, const_address parameters, void* eventHandle,
@@ -3051,8 +3090,9 @@ bool VirtualGPU::submitKernelInternal(const amd::NDRangeContainer& sizes,
argBuffer = reinterpret_cast<address>(allocKernArg(gpuKernel.KernargSegmentByteSize(),
gpuKernel.KernargSegmentAlignment()));
// Load all kernel arguments
memcpy(argBuffer, parameters, std::min(gpuKernel.KernargSegmentByteSize(),
signature.paramsSize()));
nontemporalMemcpy(argBuffer, parameters,
std::min(gpuKernel.KernargSegmentByteSize(),
signature.paramsSize()));
}
// Check for group memory overflow
+1 -1
Просмотреть файл
@@ -52,7 +52,7 @@ debug(size_t, CPU_MEMORY_GUARD_PAGE_SIZE, 64, \
"Size in KB of CPU memory guard page") \
debug(size_t, CPU_MEMORY_ALIGNMENT_SIZE, 256, \
"Size in bytes for the default alignment for guarded memory on CPU") \
debug(size_t, PARAMETERS_MIN_ALIGNMENT, 16, \
debug(size_t, PARAMETERS_MIN_ALIGNMENT, 64, \
"Minimum alignment required for the abstract parameters stack") \
debug(size_t, MEMOBJ_BASE_ADDR_ALIGN, 4*Ki, \
"Alignment of the base address of any allocate memory object") \