Check if we do not access outside of array.

Change-Id: I3357b745d36398ad52777054f64a7915278c0463
This commit is contained in:
Mrozek, Michal 2018-01-17 09:04:17 +01:00
parent 9e89d4e6cd
commit 41f0ac3019
2 changed files with 14 additions and 1 deletions

View File

@ -21,6 +21,7 @@
*/ */
#include "runtime/context/context.h" #include "runtime/context/context.h"
#include "runtime/helpers/array_count.h"
#include "runtime/helpers/basic_math.h" #include "runtime/helpers/basic_math.h"
#include "runtime/helpers/debug_helpers.h" #include "runtime/helpers/debug_helpers.h"
#include "runtime/helpers/dispatch_info.h" #include "runtime/helpers/dispatch_info.h"
@ -100,8 +101,9 @@ inline uint32_t factor<0>(size_t workItems, uint32_t workSize, uint32_t maxWorkG
void computePowerOfTwoLWS(const size_t workItems[3], size_t simdSize, uint32_t maxWorkGroupSize, size_t workGroupSize[3], const uint32_t workDim, bool canUseNx4) { void computePowerOfTwoLWS(const size_t workItems[3], size_t simdSize, uint32_t maxWorkGroupSize, size_t workGroupSize[3], const uint32_t workDim, bool canUseNx4) {
uint32_t targetIndex = canUseNx4 ? 2 : 0; uint32_t targetIndex = canUseNx4 ? 2 : 0;
auto arraySize = arrayCount(optimalHardwareThreadCountGeneric);
while (optimalHardwareThreadCountGeneric[targetIndex] > 1 && maxWorkGroupSize < optimalHardwareThreadCountGeneric[targetIndex] * simdSize) while (targetIndex < arraySize && optimalHardwareThreadCountGeneric[targetIndex] > 1 && maxWorkGroupSize < optimalHardwareThreadCountGeneric[targetIndex] * simdSize)
targetIndex++; targetIndex++;
uint32_t optimalLocalThreads = optimalHardwareThreadCountGeneric[targetIndex]; uint32_t optimalLocalThreads = optimalHardwareThreadCountGeneric[targetIndex];

View File

@ -624,6 +624,17 @@ TEST(localWorkSizeTest, givenDispatchInfoWhenWorkSizeInfoIsCreatedThenItHasCorre
WorkSizeInfo workSizeInfo(dispatchInfo); WorkSizeInfo workSizeInfo(dispatchInfo);
EXPECT_EQ(workSizeInfo.numThreadsPerSubSlice, threadsPerEu * euPerSubSlice); EXPECT_EQ(workSizeInfo.numThreadsPerSubSlice, threadsPerEu * euPerSubSlice);
} }
TEST(localWorkSizeTest, givenMaxWorkgroupSizeEqualToSimdSizeWhenLwsIsCalculatedThenItIsDownsizedToMaxWorkgroupSize) {
WorkSizeInfo wsInfo(32, 0u, 32, 0u, platformDevices[0]->pPlatform->eRenderCoreFamily, 32u, 0u, false, false);
uint32_t workDim = 2;
size_t workGroup[3] = {32, 32, 1};
size_t workGroupSize[3];
OCLRT::computeWorkgroupSizeND(wsInfo, workGroupSize, workGroup, workDim);
EXPECT_EQ(workGroupSize[0], 32u);
EXPECT_EQ(workGroupSize[1], 1u);
EXPECT_EQ(workGroupSize[2], 1u);
}
TEST(localWorkSizeTest, givenDebugVariableEnableComputeWorkSizeNDWhenCheckValueExpectTrue) { TEST(localWorkSizeTest, givenDebugVariableEnableComputeWorkSizeNDWhenCheckValueExpectTrue) {
EXPECT_TRUE(DebugManager.flags.EnableComputeWorkSizeND.get()); EXPECT_TRUE(DebugManager.flags.EnableComputeWorkSizeND.get());