Initial open source release of OpenCL 2.2 CTS.

This commit is contained in:
Kedar Patil
2017-05-16 18:25:37 +05:30
parent 6911ba5116
commit 2821bf1323
1035 changed files with 343518 additions and 0 deletions

View File

@@ -0,0 +1,20 @@
set(MODULE_NAME NON_UNIFORM_WORK_GROUP)
set(${MODULE_NAME}_SOURCES
main.cpp
test_advanced_2d.cpp
test_advanced_3d.cpp
test_advanced_other.cpp
test_basic.cpp
TestNonUniformWorkGroup.cpp
tools.cpp
../../test_common/harness/testHarness.c
../../test_common/harness/errorHelpers.c
../../test_common/harness/kernelHelpers.c
../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
)
include(../CMakeCommon.txt)
# end of file #

View File

@@ -0,0 +1,46 @@
ifdef BUILD_WITH_ATF
ATF = -framework ATF
USE_ATF = -DUSE_ATF
endif
SRCS = main.c \
test_basic.cpp \
test_advanced_2d.cpp \
test_advanced_3d.cpp \
test_advanced_other.cpp \
TestNonUniformWorkGroup.cpp \
tools.cpp \
../../test_common/harness/errorHelpers.c \
../../test_common/harness/threadTesting.c \
../../test_common/harness/testHarness.c \
../../test_common/harness/kernelHelpers.c \
../../test_common/harness/typeWrappers.cpp \
DEFINES = DONT_TEST_GARBAGE_POINTERS
SOURCES = $(abspath $(SRCS))
LIBPATH += -L/System/Library/Frameworks/OpenCL.framework/Libraries
LIBPATH += -L.
HEADERS =
TARGET = test_non_uniform_workgroup
INCLUDE =
COMPILERFLAGS = -c -Wall -g -Wshorten-64-to-32
CC = c++
CFLAGS = $(COMPILERFLAGS) ${RC_CFLAGS} ${USE_ATF} $(DEFINES:%=-D%) $(INCLUDE)
CXXFLAGS = $(COMPILERFLAGS) ${RC_CFLAGS} ${USE_ATF} $(DEFINES:%=-D%) $(INCLUDE)
LIBRARIES = -framework OpenCL -framework OpenGL -framework GLUT -framework AppKit ${ATF}
OBJECTS := ${SOURCES:.c=.o}
OBJECTS := ${OBJECTS:.cpp=.o}
TARGETOBJECT =
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) $(RC_CFLAGS) $(OBJECTS) -o $@ $(LIBPATH) $(LIBRARIES)
clean:
rm -f $(TARGET) $(OBJECTS)
.DEFAULT:
@echo The target \"$@\" does not exist in Makefile.

View File

@@ -0,0 +1,751 @@
//
// Copyright (c) 2017 The Khronos Group Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#include "TestNonUniformWorkGroup.h"
#include <vector>
#include <sstream>
#define NL "\n"
size_t TestNonUniformWorkGroup::_maxLocalWorkgroupSize = 0;
bool TestNonUniformWorkGroup::_strictMode = false;
// Main Kernel source code
static const char *KERNEL_FUNCTION =
NL "#define MAX_DIMS 3"
NL "typedef struct _DataContainerAttrib"
NL "{"
NL " unsigned long get_global_size[MAX_DIMS];"
NL " unsigned long get_global_offset[MAX_DIMS];"
NL " unsigned long get_local_size[MAX_DIMS];"
NL " unsigned long get_enqueued_local_size[MAX_DIMS];"
NL " unsigned long get_global_id[MAX_DIMS];"
NL " unsigned long get_local_id[MAX_DIMS];"
NL " unsigned long get_group_id[MAX_DIMS];"
NL " unsigned long get_num_groups[MAX_DIMS];"
NL " unsigned long get_work_dim;"
NL " unsigned short test_local_barrier_result_bool;"
NL " unsigned short test_global_barrier_result_bool;"
NL " unsigned short test_local_atomic_result_value;"
NL "}DataContainerAttrib;"
NL "enum Error{"
NL " ERR_GLOBAL_SIZE=0,"
NL " ERR_GLOBAL_WORK_OFFSET,"
NL " ERR_LOCAL_SIZE,"
NL " ERR_GLOBAL_ID,"
NL " ERR_LOCAL_ID,"
NL " ERR_ENQUEUED_LOCAL_SIZE,"
NL " ERR_NUM_GROUPS,"
NL " ERR_GROUP_ID,"
NL " ERR_WORK_DIM,"
NL " ERR_GLOBAL_BARRIER,"
NL " ERR_LOCAL_BARRIER,"
NL " ERR_GLOBAL_ATOMIC,"
NL " ERR_LOCAL_ATOMIC,"
NL " ERR_STRICT_MODE,"
NL " ERR_BUILD_STATUS,"
NL " ERR_UNKNOWN,"
NL " ERR_DIFFERENT,"
NL " _LAST_ELEM"
NL "};"
NL "uint getGlobalIndex (uint gid2, uint gid1, uint gid0) {"
NL " return gid2*get_global_size(0)*get_global_size(1) + gid1*get_global_size(0) + gid0;"
NL "}"
NL "int getRegionIndex () {"
NL " uint gid0 = get_global_id(0) - get_global_offset(0);"
NL " uint gid1 = get_global_id(1) - get_global_offset(1);"
NL " uint gid2 = get_global_id(2) - get_global_offset(2);"
NL " if (gid0 == 0 && gid1 == 0 && gid2 == 0) {"
NL " return 0;"
NL " } else if (gid0 == get_global_size(0) - 1 && gid1 == 0 && gid2 == 0) {"
NL " return 1;"
NL " } else if (gid0 == 0 && gid1 == get_global_size(1) - 1 && gid2 == 0) {"
NL " return 2;"
NL " } else if (gid0 == get_global_size(0) - 1 && gid1 == get_global_size(1) - 1 && gid2 == 0) {"
NL " return 3;"
NL " } else if (gid0 == 0 && gid1 == 0 && gid2 == get_global_size(2) - 1) {"
NL " return 4;"
NL " } else if (gid0 == get_global_size(0) - 1 && gid1 == 0 && gid2 == get_global_size(2) - 1) {"
NL " return 5;"
NL " } else if (gid0 == 0 && gid1 == get_global_size(1) - 1 && gid2 == get_global_size(2) - 1) {"
NL " return 6;"
NL " } else if (gid0 == get_global_size(0) - 1 && gid1 == get_global_size(1) - 1 && gid2 == get_global_size(2) - 1) {"
NL " return 7;"
NL " }"
NL " return -1;"
NL "}"
NL "void getLocalSize(__global DataContainerAttrib *results) {"
NL " for (unsigned short i = 0; i < MAX_DIMS; i++) {"
NL " results->get_local_size[i] = get_local_size(i);"
NL " }"
NL "}"
NL "#ifdef TESTBASIC"
// values set by this function will be checked on the host side
NL "void testBasicHost(__global DataContainerAttrib *results) {"
NL " for (unsigned short i = 0; i < MAX_DIMS; i++) {"
NL " results->get_global_size[i] = get_global_size(i);"
NL " results->get_global_offset[i] = get_global_offset(i);"
NL " results->get_enqueued_local_size[i] = get_enqueued_local_size(i);"
NL " results->get_global_id[i] = get_global_id(i);"
NL " results->get_local_id[i] = get_local_id(i);"
NL " results->get_group_id[i] = get_group_id(i);"
NL " results->get_num_groups[i] = get_num_groups(i);"
NL " }"
NL " results->get_work_dim = get_work_dim();"
NL "}"
// values set by this function are checked on the kernel side
NL "void testBasicKernel(__global unsigned int *errorCounterBuffer, __local DataContainerAttrib *resultsForThread0) {"
NL " uint lid0 = get_local_id(0);"
NL " uint lid1 = get_local_id(1);"
NL " uint lid2 = get_local_id(2);"
NL " if (lid0 == 0 && lid1 == 0 && lid2 == 0) {"
NL " for (unsigned short i = 0; i < MAX_DIMS; i++) {"
NL " resultsForThread0->get_global_size[i] = get_global_size(i);"
NL " resultsForThread0->get_global_offset[i] = get_global_offset(i);"
NL " resultsForThread0->get_enqueued_local_size[i] = get_enqueued_local_size(i);"
NL " resultsForThread0->get_group_id[i] = get_group_id(i);"
NL " resultsForThread0->get_num_groups[i] = get_num_groups(i);"
NL " }"
NL " resultsForThread0->get_work_dim = get_work_dim();"
NL " }"
NL " barrier(CLK_LOCAL_MEM_FENCE);"
// verifies built in functions on the kernel side
NL " if (lid0 != 0 || lid1 != 0 || lid2 != 0) {"
NL " for (unsigned short i = 0; i < MAX_DIMS; i++) {"
NL " if (resultsForThread0->get_global_size[i] != get_global_size(i)) {"
NL " atomic_inc(&errorCounterBuffer[ERR_GLOBAL_SIZE]);"
NL " }"
NL " if (resultsForThread0->get_global_offset[i] != get_global_offset(i)) {"
NL " atomic_inc(&errorCounterBuffer[ERR_GLOBAL_WORK_OFFSET]);"
NL " }"
NL " if (resultsForThread0->get_enqueued_local_size[i] != get_enqueued_local_size(i)) {"
NL " atomic_inc(&errorCounterBuffer[ERR_ENQUEUED_LOCAL_SIZE]);"
NL " }"
NL " if (resultsForThread0->get_group_id[i] != get_group_id(i)) {"
NL " atomic_inc(&errorCounterBuffer[ERR_GROUP_ID]);"
NL " }"
NL " if (resultsForThread0->get_num_groups[i] != get_num_groups(i)) {"
NL " atomic_inc(&errorCounterBuffer[ERR_NUM_GROUPS]);"
NL " }"
NL " }"
NL " if (resultsForThread0->get_work_dim != get_work_dim()) {"
NL " atomic_inc(&errorCounterBuffer[ERR_WORK_DIM]);"
NL " }"
NL " }"
NL "}"
NL "#endif"
NL "#ifdef TESTBARRIERS"
NL "void testBarriers(__global unsigned int *errorCounterBuffer, __local unsigned int *testLocalBuffer, __global unsigned int *testGlobalBuffer) {"
NL " uint gid0 = get_global_id(0);"
NL " uint gid1 = get_global_id(1);"
NL " uint gid2 = get_global_id(2);"
NL " uint lid0 = get_local_id(0);"
NL " uint lid1 = get_local_id(1);"
NL " uint lid2 = get_local_id(2);"
NL
NL " uint globalIndex = getGlobalIndex(gid2-get_global_offset(2), gid1-get_global_offset(1), gid0-get_global_offset(0));"
NL " uint localIndex = lid2*get_local_size(0)*get_local_size(1) + lid1*get_local_size(0) + lid0;"
NL " testLocalBuffer[localIndex] = 0;"
NL " testGlobalBuffer[globalIndex] = 0;"
NL " uint maxLocalIndex = get_local_size(0)*get_local_size(1)*get_local_size(2)-1;"
NL " uint nextLocalIndex = (localIndex>=maxLocalIndex)?0:(localIndex+1);"
NL " uint next_lid0 = (lid0+1>=get_local_size(0))?0:lid0+1;"
NL " uint next_lid1 = (lid1+1>=get_local_size(1))?0:lid1+1;"
NL " uint next_lid2 = (lid2+1>=get_local_size(2))?0:lid2+1;"
NL " uint nextGlobalIndexInLocalWorkGroup = getGlobalIndex (get_group_id(2)*get_enqueued_local_size(2)+next_lid2, get_group_id(1)*get_enqueued_local_size(1)+next_lid1, get_group_id(0)*get_enqueued_local_size(0)+next_lid0);"
// testing local barriers
NL " testLocalBuffer[localIndex] = localIndex;"
NL " barrier(CLK_LOCAL_MEM_FENCE);"
NL " uint temp = testLocalBuffer[nextLocalIndex];"
NL " if (temp != nextLocalIndex) {"
NL " atomic_inc(&errorCounterBuffer[ERR_LOCAL_BARRIER]);"
NL " }"
// testing global barriers
NL " testGlobalBuffer[globalIndex] = globalIndex;"
NL " barrier(CLK_GLOBAL_MEM_FENCE);"
NL " uint temp2 = testGlobalBuffer[nextGlobalIndexInLocalWorkGroup];"
NL " if (temp2 != nextGlobalIndexInLocalWorkGroup) {"
NL " atomic_inc(&errorCounterBuffer[ERR_GLOBAL_BARRIER]);"
NL " }"
NL "}"
NL "#endif"
NL "#ifdef TESTATOMICS"
NL "void testAtomics(__global unsigned int *globalAtomicTestVariable, __local unsigned int *localAtomicTestVariable) {"
NL " uint gid0 = get_global_id(0);"
NL " uint gid1 = get_global_id(1);"
NL " uint gid2 = get_global_id(2);"
NL
NL " uint globalIndex = getGlobalIndex(gid2-get_global_offset(2), gid1-get_global_offset(1), gid0-get_global_offset(0));"
// testing atomic function on local memory
NL " atomic_inc(localAtomicTestVariable);"
NL " barrier(CLK_LOCAL_MEM_FENCE);"
// testing atomic function on global memory
NL " atomic_inc(globalAtomicTestVariable);"
NL "}"
NL "#endif"
NL "#ifdef RWGSX"
NL "#ifdef RWGSY"
NL "#ifdef RWGSZ"
NL "__attribute__((reqd_work_group_size(RWGSX, RWGSY, RWGSZ)))"
NL "#endif"
NL "#endif"
NL "#endif"
NL "__kernel void testKernel(__global DataContainerAttrib *results, __local unsigned int *testLocalBuffer,"
NL " __global unsigned int *testGlobalBuffer, __global unsigned int *globalAtomicTestVariable, __global unsigned int *errorCounterBuffer) {"
NL " uint gid0 = get_global_id(0);"
NL " uint gid1 = get_global_id(1);"
NL " uint gid2 = get_global_id(2);"
NL
NL " uint globalIndex = getGlobalIndex(gid2-get_global_offset(2), gid1-get_global_offset(1), gid0-get_global_offset(0));"
NL " int regionIndex = getRegionIndex();"
NL " if (regionIndex >= 0) {"
NL " getLocalSize(&results[regionIndex]);"
NL " }"
NL "#ifdef TESTBASIC"
NL " if (regionIndex >= 0) {"
NL " testBasicHost(&results[regionIndex]);"
NL " }"
NL " __local DataContainerAttrib resultsForThread0;"
NL " testBasicKernel(errorCounterBuffer, &resultsForThread0);"
NL "#endif"
NL "#ifdef TESTBARRIERS"
NL " testBarriers(errorCounterBuffer, testLocalBuffer, testGlobalBuffer);"
NL "#endif"
NL "#ifdef TESTATOMICS"
NL " __local unsigned int localAtomicTestVariable;"
NL " localAtomicTestVariable = 0;"
NL " barrier(CLK_LOCAL_MEM_FENCE);"
NL " testAtomics(globalAtomicTestVariable, &localAtomicTestVariable);"
NL " barrier(CLK_LOCAL_MEM_FENCE);"
NL " if (localAtomicTestVariable != get_local_size(0) * get_local_size(1) * get_local_size(2)) {"
NL " atomic_inc(&errorCounterBuffer[ERR_LOCAL_ATOMIC]);"
NL " }"
NL "#endif"
NL "}"
NL ;
TestNonUniformWorkGroup::TestNonUniformWorkGroup (const cl_device_id &device, const cl_context &context,
const cl_command_queue &queue, const cl_uint dims, const size_t *globalSize, const size_t *localSize, const size_t *buffersSize,
const size_t *globalWorkOffset, const size_t *reqdWorkGroupSize)
: _device(device), _context(context), _queue(queue), _dims (dims) {
if (globalSize == NULL || dims < 1 || dims > 3) {
//throw std::invalid_argument("globalSize is NULL value.");
// This is method of informing that parameters are wrong.
// It would be checked by prepareDevice() function.
// This is used because of lack of exception support.
_globalSize[0] = 0;
return;
}
cl_uint i;
_globalWorkOffset_IsNull = true;
_localSize_IsNull = true;
setGlobalWorkgroupSize(globalSize);
setLocalWorkgroupSize(globalSize,localSize);
for (i = _dims; i < MAX_DIMS; i++) {
_globalSize[i] = 1;
}
for (i = 0; i < MAX_DIMS; i++) {
_globalWorkOffset[i] = 0;
}
if (globalWorkOffset) {
_globalWorkOffset_IsNull = false;
for (i = 0; i < _dims; i++) {
_globalWorkOffset[i] = globalWorkOffset[i];
}
}
for (i = 0; i < MAX_DIMS; i++) {
_enqueuedLocalSize[i] = 1;
}
if (localSize) {
_localSize_IsNull = false;
for (i = 0; i < _dims; i++) {
_enqueuedLocalSize[i] = _localSize[i];
}
}
if (reqdWorkGroupSize) {
for (i = 0; i < _dims; i++) {
_reqdWorkGroupSize[i] = reqdWorkGroupSize[i];
}
for (i = _dims; i < MAX_DIMS; i++) {
_reqdWorkGroupSize[i] = 1;
}
} else {
_reqdWorkGroupSize[0] = 0;
_reqdWorkGroupSize[1] = 0;
_reqdWorkGroupSize[2] = 0;
}
_testRange = Range::ALL;
_numOfGlobalWorkItems = _globalSize[0]*_globalSize[1]*_globalSize[2];
DataContainerAttrib temp = {{0, 0, 0}};
// array with results from each region
_resultsRegionArray.resize(NUMBER_OF_REGIONS, temp);
_referenceRegionArray.resize(NUMBER_OF_REGIONS, temp);
}
TestNonUniformWorkGroup::~TestNonUniformWorkGroup () {
if (_err.checkError()) {
_err.showStats();
}
}
void TestNonUniformWorkGroup::setLocalWorkgroupSize (const size_t *globalSize, const size_t *localSize)
{
cl_uint i;
// Enforce localSize should not exceed globalSize
if (localSize) {
for (i = 0; i < _dims; i++) {
if ((globalSize[i] < localSize[i])) {
_localSize[i] = globalSize[i];
}else{
_localSize[i] = localSize[i];
}
}
}
}
void TestNonUniformWorkGroup::setGlobalWorkgroupSize (const size_t *globalSize)
{
cl_uint i;
for (i = 0; i < _dims; i++) {
_globalSize[i] = globalSize[i];
}
}
void TestNonUniformWorkGroup::verifyData (DataContainerAttrib * reference, DataContainerAttrib * results, short regionNumber) {
std::ostringstream tmp;
std::string errorLocation;
if (_testRange & Range::BASIC) {
for (unsigned short i = 0; i < MAX_DIMS; i++) {
tmp.str("");
tmp.clear();
tmp << "region number: " << regionNumber << " for dim: " << i;
errorLocation = tmp.str();
if (results->get_global_size[i] != reference->get_global_size[i]) {
_err.show(Error::ERR_GLOBAL_SIZE, errorLocation, results->get_global_size[i], reference->get_global_size[i]);
}
if (results->get_global_offset[i] != reference->get_global_offset[i]) {
_err.show(Error::ERR_GLOBAL_WORK_OFFSET, errorLocation, results->get_global_offset[i], reference->get_global_offset[i]);
}
if (results->get_local_size[i] != reference->get_local_size[i] || results->get_local_size[i] > _maxWorkItemSizes[i]) {
_err.show(Error::ERR_LOCAL_SIZE, errorLocation, results->get_local_size[i], reference->get_local_size[i]);
}
if (results->get_enqueued_local_size[i] != reference->get_enqueued_local_size[i] || results->get_enqueued_local_size[i] > _maxWorkItemSizes[i]) {
_err.show(Error::ERR_ENQUEUED_LOCAL_SIZE, errorLocation, results->get_enqueued_local_size[i], reference->get_enqueued_local_size[i]);
}
if (results->get_num_groups[i] != reference->get_num_groups[i]) {
_err.show(Error::ERR_NUM_GROUPS, errorLocation, results->get_num_groups[i], reference->get_num_groups[i]);
}
}
}
tmp.str("");
tmp.clear();
tmp << "region number: " << regionNumber;
errorLocation = tmp.str();
if (_testRange & Range::BASIC) {
if (results->get_work_dim != reference->get_work_dim) {
_err.show(Error::ERR_WORK_DIM, errorLocation, results->get_work_dim, reference->get_work_dim);
}
}
}
void TestNonUniformWorkGroup::calculateExpectedValues () {
size_t nonRemainderGlobalSize[MAX_DIMS];
size_t numberOfPossibleRegions[MAX_DIMS];
nonRemainderGlobalSize[0] = _globalSize[0] - (_globalSize[0] % _enqueuedLocalSize[0]);
nonRemainderGlobalSize[1] = _globalSize[1] - (_globalSize[1] % _enqueuedLocalSize[1]);
nonRemainderGlobalSize[2] = _globalSize[2] - (_globalSize[2] % _enqueuedLocalSize[2]);
numberOfPossibleRegions[0] = (_globalSize[0]>1)?2:1;
numberOfPossibleRegions[1] = (_globalSize[1]>1)?2:1;
numberOfPossibleRegions[2] = (_globalSize[2]>1)?2:1;
for (cl_ushort i = 0; i < NUMBER_OF_REGIONS; ++i) {
if (i & 0x01 && numberOfPossibleRegions[0] == 1) {
continue;
}
if (i & 0x02 && numberOfPossibleRegions[1] == 1) {
continue;
}
if (i & 0x04 && numberOfPossibleRegions[2] == 1) {
continue;
}
for (cl_ushort dim = 0; dim < MAX_DIMS; ++dim) {
_referenceRegionArray[i].get_global_size[dim] = static_cast<unsigned long>(_globalSize[dim]);
_referenceRegionArray[i].get_global_offset[dim] = static_cast<unsigned long>(_globalWorkOffset[dim]);
_referenceRegionArray[i].get_enqueued_local_size[dim] = static_cast<unsigned long>(_enqueuedLocalSize[dim]);
_referenceRegionArray[i].get_local_size[dim] = static_cast<unsigned long>(_enqueuedLocalSize[dim]);
_referenceRegionArray[i].get_num_groups[dim] = static_cast<unsigned long>(ceil(static_cast<float>(_globalSize[dim]) / _enqueuedLocalSize[dim]));
}
_referenceRegionArray[i].get_work_dim = _dims;
if (i & 0x01) {
_referenceRegionArray[i].get_local_size[0] = static_cast<unsigned long>((_globalSize[0] - 1) % _enqueuedLocalSize[0] + 1);
}
if (i & 0x02) {
_referenceRegionArray[i].get_local_size[1] = static_cast<unsigned long>((_globalSize[1] - 1) % _enqueuedLocalSize[1] + 1);
}
if (i & 0x04) {
_referenceRegionArray[i].get_local_size[2] = static_cast<unsigned long>((_globalSize[2] - 1) % _enqueuedLocalSize[2] + 1);
}
}
}
size_t TestNonUniformWorkGroup::getMaxLocalWorkgroupSize (const cl_device_id &device) {
int err;
if (TestNonUniformWorkGroup::_maxLocalWorkgroupSize == 0) {
err = clGetDeviceInfo(device, CL_DEVICE_MAX_WORK_GROUP_SIZE,
sizeof(TestNonUniformWorkGroup::_maxLocalWorkgroupSize), &TestNonUniformWorkGroup::_maxLocalWorkgroupSize, NULL);
}
return TestNonUniformWorkGroup::_maxLocalWorkgroupSize;
}
void TestNonUniformWorkGroup::enableStrictMode(bool state) {
TestNonUniformWorkGroup::_strictMode = state;
}
int TestNonUniformWorkGroup::prepareDevice () {
int err;
cl_uint device_max_dimensions;
if (_globalSize[0] == 0)
{
log_error("Some arguments passed into constructor were wrong.\n");
return -1;
}
if(_localSize_IsNull == false)
calculateExpectedValues();
err = clGetDeviceInfo(_device, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS,
sizeof(device_max_dimensions), &device_max_dimensions, NULL);
test_error(err, "clGetDeviceInfo failed");
err = clGetDeviceInfo(_device, CL_DEVICE_MAX_WORK_ITEM_SIZES,
sizeof(_maxWorkItemSizes), _maxWorkItemSizes, NULL);
test_error(err, "clGetDeviceInfo failed");
std::string buildOptions = BUILD_CL_STD_2_0;
if(_reqdWorkGroupSize[0] != 0 && _reqdWorkGroupSize[1] != 0 && _reqdWorkGroupSize[2] != 0) {
std::ostringstream tmp(" ");
tmp << " -D RWGSX=" << _reqdWorkGroupSize[0]
<< " -D RWGSY=" << _reqdWorkGroupSize[1]
<< " -D RWGSZ=" << _reqdWorkGroupSize[2] << " ";
buildOptions += tmp.str();
}
if (_testRange & Range::BASIC)
buildOptions += " -D TESTBASIC";
if (_testRange & Range::ATOMICS)
buildOptions += " -D TESTATOMICS";
if (_testRange & Range::BARRIERS)
buildOptions += " -D TESTBARRIERS";
err = create_single_kernel_helper_with_build_options (_context, &_program, &_testKernel, 1,
&KERNEL_FUNCTION, "testKernel", buildOptions.c_str());
if (err)
{
log_error("Error %d in line: %d of file %s\n", err, __LINE__, __FILE__);
return -1;
}
return 0;
}
int TestNonUniformWorkGroup::verifyResults () {
if (_localSize_IsNull) {
// for global work groups where local work group size is not defined (set to NULL in clEnqueueNDRangeKernel)
// we need to check what optimal size was chosen by device
// we assumed that local size value for work item 0 is right for the rest work items
_enqueuedLocalSize[0] = static_cast<size_t>(_resultsRegionArray[0].get_local_size[0]);
_enqueuedLocalSize[1] = static_cast<size_t>(_resultsRegionArray[0].get_local_size[1]);
_enqueuedLocalSize[2] = static_cast<size_t>(_resultsRegionArray[0].get_local_size[2]);
calculateExpectedValues();
// strict mode verification
if(_strictMode) {
size_t localWorkGroupSize = _enqueuedLocalSize[0]*_enqueuedLocalSize[1]*_enqueuedLocalSize[2];
if (localWorkGroupSize != TestNonUniformWorkGroup::getMaxLocalWorkgroupSize(_device))
_err.show(Error::ERR_STRICT_MODE, "",localWorkGroupSize, TestNonUniformWorkGroup::getMaxLocalWorkgroupSize(_device));
}
log_info ("Local work group size calculated by driver: %s\n", showArray(_enqueuedLocalSize, _dims).c_str());
}
for (cl_ushort i = 0; i < NUMBER_OF_REGIONS; ++i) {
verifyData(&_referenceRegionArray[i], &_resultsRegionArray[i], i);
}
if (_testRange & Range::ATOMICS) {
if (_globalAtomicTestValue != _numOfGlobalWorkItems) {
_err.show(Error::ERR_GLOBAL_ATOMIC);
}
}
if (_err.checkError())
return -1;
return 0;
}
std::string showArray (const size_t *arr, cl_uint dims) {
std::ostringstream tmpStringStream ("");
tmpStringStream << "{";
for (cl_uint i=0; i < dims; i++) {
tmpStringStream << arr[i];
if (i+1 < dims)
tmpStringStream << ", ";
}
tmpStringStream << "}";
return tmpStringStream.str();
}
void TestNonUniformWorkGroup::showTestInfo () {
std::string tmpString;
log_info ("T E S T P A R A M E T E R S :\n");
log_info ("\tNumber of dimensions:\t%d\n", _dims);
tmpString = showArray(_globalSize, _dims);
log_info("\tGlobal work group size:\t%s\n", tmpString.c_str());
if (!_localSize_IsNull) {
tmpString = showArray(_enqueuedLocalSize, _dims);
} else {
tmpString = "NULL";
}
log_info("\tLocal work group size:\t%s\n", tmpString.c_str());
if (!_globalWorkOffset_IsNull) {
tmpString = showArray(_globalWorkOffset, _dims);
} else {
tmpString = "NULL";
}
log_info("\tGlobal work group offset:\t%s\n", tmpString.c_str());
if (_reqdWorkGroupSize[0] != 0 && _reqdWorkGroupSize[1] != 0 && _reqdWorkGroupSize[2] != 0) {
tmpString = showArray(_reqdWorkGroupSize, _dims);
} else {
tmpString = "attribute disabled";
}
log_info ("\treqd_work_group_size attribute:\t%s\n", tmpString.c_str());
tmpString = "";
if(_testRange & Range::BASIC)
tmpString += "basic";
if(_testRange & Range::ATOMICS) {
if(tmpString != "") tmpString += ", ";
tmpString += "atomics";
}
if(_testRange & Range::BARRIERS) {
if(tmpString != "") tmpString += ", ";
tmpString += "barriers";
}
log_info ("\tTest range:\t%s\n", tmpString.c_str());
if(_strictMode) {
log_info ("\tStrict mode:\tON\n");
if (!_localSize_IsNull) {
log_info ("\tATTENTION: strict mode applies only NULL local work group size\n");
} else {
log_info ("\t\tExpected value of local work group size is %ld.\n",
TestNonUniformWorkGroup::getMaxLocalWorkgroupSize(_device));
}
}
}
int TestNonUniformWorkGroup::runKernel () {
int err;
// TEST INFO
showTestInfo();
size_t localArraySize = (_localSize_IsNull)?TestNonUniformWorkGroup::getMaxLocalWorkgroupSize(_device):(_enqueuedLocalSize[0]*_enqueuedLocalSize[1]*_enqueuedLocalSize[2]);
clMemWrapper resultsRegionArray = clCreateBuffer(_context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, _resultsRegionArray.size() * sizeof(DataContainerAttrib), &_resultsRegionArray.front(), &err);
test_error(err, "clCreateBuffer failed");
size_t *localSizePtr = (_localSize_IsNull)?NULL:_enqueuedLocalSize;
size_t *globalWorkOffsetPtr = (_globalWorkOffset_IsNull)?NULL:_globalWorkOffset;
err = clSetKernelArg(_testKernel, 0, sizeof(resultsRegionArray), &resultsRegionArray);
test_error(err, "clSetKernelArg failed");
//creating local buffer
err = clSetKernelArg(_testKernel, 1, localArraySize*sizeof(unsigned int), NULL);
test_error(err, "clSetKernelArg failed");
clMemWrapper testGlobalArray = clCreateBuffer(_context, CL_MEM_READ_WRITE, _numOfGlobalWorkItems*sizeof(cl_uint), NULL, &err);
test_error(err, "clCreateBuffer failed");
err = clSetKernelArg(_testKernel, 2, sizeof(testGlobalArray), &testGlobalArray);
test_error(err, "clSetKernelArg failed");
_globalAtomicTestValue = 0;
clMemWrapper globalAtomicTestVariable = clCreateBuffer(_context, (CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR), sizeof(_globalAtomicTestValue), &_globalAtomicTestValue, &err);
test_error(err, "clCreateBuffer failed");
err = clSetKernelArg(_testKernel, 3, sizeof(globalAtomicTestVariable), &globalAtomicTestVariable);
test_error(err, "clSetKernelArg failed");
clMemWrapper errorArray = clCreateBuffer(_context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, _err.errorArrayCounterSize(), _err.errorArrayCounter(), &err);
test_error(err, "clCreateBuffer failed");
err = clSetKernelArg(_testKernel, 4, sizeof(errorArray), &errorArray);
test_error(err, "clSetKernelArg failed");
err = clEnqueueNDRangeKernel(_queue, _testKernel, _dims, globalWorkOffsetPtr, _globalSize,
localSizePtr, 0, NULL, NULL);
test_error(err, "clEnqueueNDRangeKernel failed");
err = clFinish(_queue);
test_error(err, "clFinish failed");
err = clEnqueueReadBuffer(_queue, globalAtomicTestVariable, CL_TRUE, 0, sizeof(unsigned int), &_globalAtomicTestValue, 0, NULL, NULL);
test_error(err, "clEnqueueReadBuffer failed");
if (_err.checkError()) {
return -1;
}
// synchronization of main buffer
err = clEnqueueReadBuffer(_queue, resultsRegionArray, CL_TRUE, 0, _resultsRegionArray.size() * sizeof(DataContainerAttrib), &_resultsRegionArray.front(), 0, NULL, NULL);
test_error(err, "clEnqueueReadBuffer failed");
err = clEnqueueReadBuffer(_queue, errorArray, CL_TRUE, 0, _err.errorArrayCounterSize(), _err.errorArrayCounter(), 0, NULL, NULL);
test_error(err, "clEnqueueReadBuffer failed");
// Synchronization of errors occurred in kernel into general error stats
_err.synchronizeStatsMap();
return 0;
}
void SubTestExecutor::runTestNonUniformWorkGroup(const cl_uint dims, const size_t *globalSize,
const size_t *localSize, int range) {
runTestNonUniformWorkGroup (dims, globalSize, localSize, NULL, NULL, range);
}
void SubTestExecutor::runTestNonUniformWorkGroup(const cl_uint dims, const size_t *globalSize,
const size_t *localSize, const size_t *globalWorkOffset,
const size_t *reqdWorkGroupSize, int range) {
int err;
++_overallCounter;
TestNonUniformWorkGroup test (_device, _context, _queue, dims, globalSize, localSize,
NULL, globalWorkOffset, reqdWorkGroupSize);
test.setTestRange(range);
err = test.prepareDevice();
if (err) {
log_error ("Error: prepare device\n");
++_failCounter;
return;
}
err = test.runKernel();
if (err) {
log_error ("Error: run kernel\n");
++_failCounter;
return;
}
err = test.verifyResults();
if (err) {
log_error ("Error: verify results\n");
++_failCounter;
return;
}
}
int SubTestExecutor::calculateWorkGroupSize(size_t &maxWgSize, int testRange) {
int err;
clProgramWrapper program;
clKernelWrapper testKernel;
std::string buildOptions = BUILD_CL_STD_2_0;
if (testRange & Range::BASIC)
buildOptions += " -D TESTBASIC";
if (testRange & Range::ATOMICS)
buildOptions += " -D TESTATOMICS";
if (testRange & Range::BARRIERS)
buildOptions += " -D TESTBARRIERS";
err = create_single_kernel_helper_with_build_options (_context, &program, &testKernel, 1,
&KERNEL_FUNCTION, "testKernel", buildOptions.c_str());
if (err)
{
log_error("Error %d in line: %d of file %s\n", err, __LINE__, __FILE__);
return err;
}
err = clGetKernelWorkGroupInfo (testKernel, _device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(maxWgSize), &maxWgSize, NULL);
test_error(err, "clGetKernelWorkGroupInfo failed");
TestNonUniformWorkGroup::setMaxLocalWorkgroupSize(maxWgSize);
return 0;
}
int SubTestExecutor::status() {
if (_failCounter>0) {
log_error ("%d subtest(s) (of %d) failed\n", _failCounter, _overallCounter);
return -1;
} else {
log_info ("All %d subtest(s) passed\n", _overallCounter);
return 0;
}
}

View File

@@ -0,0 +1,146 @@
//
// Copyright (c) 2017 The Khronos Group Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#ifndef _TESTNONUNIFORMWORKGROUP_H
#define _TESTNONUNIFORMWORKGROUP_H
#include "procs.h"
#include <vector>
#include "tools.h"
#include <algorithm>
#define MAX_SIZE_OF_ALLOCATED_MEMORY (400*1024*1024)
#define NUMBER_OF_REGIONS 8
#define BUILD_CL_STD_2_0 "-cl-std=CL2.0"
#define MAX_DIMS 3
// This structure reflects data received from kernel.
typedef struct _DataContainerAttrib
{
cl_ulong get_global_size[MAX_DIMS];
cl_ulong get_global_offset[MAX_DIMS];
cl_ulong get_local_size[MAX_DIMS];
cl_ulong get_enqueued_local_size[MAX_DIMS];
cl_ulong get_global_id[MAX_DIMS];
cl_ulong get_local_id[MAX_DIMS];
cl_ulong get_group_id[MAX_DIMS];
cl_ulong get_num_groups[MAX_DIMS];
cl_ulong get_work_dim;
cl_ushort test_local_barrier_result_bool;
cl_ushort test_global_barrier_result_bool;
cl_ushort test_local_atomic_result_value;
}DataContainerAttrib;
// Describes range of testing.
namespace Range {
enum RangeEnum {
BASIC = (1 << 0),
BARRIERS = (1 << 1),
ATOMICS = (1 << 2),
ALL = Range::BASIC | Range::BARRIERS | Range::ATOMICS
};
}
std::string showArray (const size_t *arr, cl_uint dims);
// Main class responsible for testing
class TestNonUniformWorkGroup {
public:
TestNonUniformWorkGroup (const cl_device_id &device, const cl_context &context,
const cl_command_queue &queue, const cl_uint dims, const size_t *globalSize,
const size_t *localSize, const size_t *buffersSize, const size_t *globalWorkOffset,
const size_t *reqdWorkGroupSize=NULL);
~TestNonUniformWorkGroup ();
static size_t getMaxLocalWorkgroupSize (const cl_device_id &device);
static void setMaxLocalWorkgroupSize (size_t workGroupSize) {
TestNonUniformWorkGroup::_maxLocalWorkgroupSize = workGroupSize;
}
static void enableStrictMode (bool state);
void setTestRange (int range) {_testRange = range;}
int prepareDevice ();
int verifyResults ();
int runKernel ();
private:
size_t _globalSize[MAX_DIMS];
size_t _localSize[MAX_DIMS];
size_t _globalWorkOffset[MAX_DIMS];
bool _globalWorkOffset_IsNull;
size_t _enqueuedLocalSize[MAX_DIMS];
bool _localSize_IsNull;
size_t _reqdWorkGroupSize[MAX_DIMS];
static size_t _maxLocalWorkgroupSize;
size_t _maxWorkItemSizes[MAX_DIMS];
size_t _numOfGlobalWorkItems; // in global work group
const cl_device_id _device;
const cl_context _context;
const cl_command_queue _queue;
const cl_uint _dims;
int _testRange;
std::vector<DataContainerAttrib> _resultsRegionArray;
std::vector<DataContainerAttrib> _referenceRegionArray;
cl_uint _globalAtomicTestValue;
clProgramWrapper _program;
clKernelWrapper _testKernel;
Error::ErrorClass _err;
TestNonUniformWorkGroup ();
static bool _strictMode;
void setLocalWorkgroupSize (const size_t *globalSize, const size_t *localSize);
void setGlobalWorkgroupSize (const size_t *globalSize);
void verifyData (DataContainerAttrib * reference, DataContainerAttrib * results, short regionNumber);
void calculateExpectedValues ();
void showTestInfo ();
};
// Class responsible for running subtest scenarios in test function
class SubTestExecutor {
public:
SubTestExecutor(const cl_device_id &device, const cl_context &context, const cl_command_queue &queue)
: _device (device), _context (context), _queue (queue), _failCounter (0), _overallCounter (0) {}
void runTestNonUniformWorkGroup (const cl_uint dims, const size_t *globalSize,
const size_t *localSize, int range);
void runTestNonUniformWorkGroup (const cl_uint dims, const size_t *globalSize,
const size_t *localSize, const size_t *globalWorkOffset,
const size_t *reqdWorkGroupSize, int range);
int calculateWorkGroupSize(size_t &maxWgSize, int testRange);
int status();
private:
SubTestExecutor();
const cl_device_id _device;
const cl_context _context;
const cl_command_queue _queue;
unsigned int _failCounter;
unsigned int _overallCounter;
};
#endif // _TESTNONUNIFORMWORKGROUP_H

View File

@@ -0,0 +1,88 @@
//
// Copyright (c) 2017 The Khronos Group Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#include "procs.h"
#include "tools.h"
#include "../../test_common/harness/testHarness.h"
#include "TestNonUniformWorkGroup.h"
basefn basefn_list[] = {
test_non_uniform_1d_basic,
test_non_uniform_1d_atomics,
test_non_uniform_1d_barriers,
test_non_uniform_2d_basic,
test_non_uniform_2d_atomics,
test_non_uniform_2d_barriers,
test_non_uniform_3d_basic,
test_non_uniform_3d_atomics,
test_non_uniform_3d_barriers,
test_non_uniform_other_basic,
test_non_uniform_other_atomics,
test_non_uniform_other_barriers
};
const char *basefn_names[] = {
"non_uniform_1d_basic",
"non_uniform_1d_atomics",
"non_uniform_1d_barriers",
"non_uniform_2d_basic",
"non_uniform_2d_atomics",
"non_uniform_2d_barriers",
"non_uniform_3d_basic",
"non_uniform_3d_atomics",
"non_uniform_3d_barriers",
"non_uniform_other_basic",
"non_uniform_other_atomics",
"non_uniform_other_barriers",
};
ct_assert((sizeof(basefn_names) / sizeof(basefn_names[0])) == (sizeof(basefn_list) / sizeof(basefn_list[0])));
int num_fns = sizeof(basefn_names) / sizeof(char *);
int main(int argc, const char *argv[])
{
typedef std::vector<const char *> ArgsVector;
ArgsVector programArgs;
programArgs.assign(argv, argv+argc);
int numFns = num_fns;
basefn *baseFnList = basefn_list;
const char **baseFnNames = basefn_names;
for (ArgsVector::iterator it = programArgs.begin(); it!=programArgs.end();) {
if(*it == std::string("-strict")) {
TestNonUniformWorkGroup::enableStrictMode(true);
it=programArgs.erase(it);
} else {
++it;
}
}
PrimeNumbers::generatePrimeNumbers(100000);
return runTestHarness(static_cast<int>(programArgs.size()), &programArgs.front(), numFns, baseFnList, baseFnNames, false /* image support required */, false /* force no context creation */, 0 );
}

View File

@@ -0,0 +1,32 @@
//
// Copyright (c) 2017 The Khronos Group Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#include "../../test_common/harness/typeWrappers.h"
extern int test_non_uniform_1d_basic(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_non_uniform_1d_atomics(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_non_uniform_1d_barriers(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_non_uniform_2d_basic(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_non_uniform_2d_atomics(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_non_uniform_2d_barriers(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_non_uniform_3d_basic(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_non_uniform_3d_atomics(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_non_uniform_3d_barriers(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_non_uniform_other_basic(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_non_uniform_other_atomics(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);
extern int test_non_uniform_other_barriers(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements);

View File

@@ -0,0 +1,383 @@
//
// Copyright (c) 2017 The Khronos Group Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#include "procs.h"
#include "tools.h"
#include "TestNonUniformWorkGroup.h"
int
test_non_uniform_2d_basic(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
{
SubTestExecutor exec(device, context, queue);
size_t maxWgSize;
int err;
err = exec.calculateWorkGroupSize(maxWgSize, Range::BASIC);
if (err) {
log_error ("Cannot calculate work group size.");
return -1;
}
// non_uniform_2d_max_wg_size_plus_1_basic
{
size_t globalSize[] = {maxWgSize+1, maxWgSize};
size_t localSize[] = {maxWgSize, 1};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_2d_prime_number_basic
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
size_t globalSize[] = {primeNumber, maxWgSize};
size_t localSize[] = {maxWgSize/2, 2};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_2d_two_prime_numbers_basic
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
int primeNumber2 = 1759;
size_t globalSize[] = {primeNumber2, primeNumber};
size_t localSize[] = {16, maxWgSize/16};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_2d_prime_number_basic_2
{
int primeNumber = 1327;
size_t globalSize[] = {primeNumber, primeNumber};
size_t localSize[] = {maxWgSize/32, 32};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_2d_combination_of_max_wg_size_basic
{
size_t globalSize[] = {maxWgSize + 2, maxWgSize + 4};
size_t localSize[] = {maxWgSize/32, 32};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_2d_two_prime_numbers_and_ls_null_basic
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
unsigned int primeNumber2 = 1669;
size_t globalSize[] = {primeNumber, primeNumber2};
size_t *localSize = NULL;
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_2d_prime_number_and_ls_null_basic
{
unsigned int primeNumber = 1249;
size_t globalSize[] = {primeNumber, primeNumber};
size_t *localSize = NULL;
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_2d_four_prime_numbers_basic
{
unsigned int primeNumber = 1951;
unsigned int primeNumber2 = 911;
unsigned int primeNumber3 = 13;
unsigned int primeNumber4 = 17;
PrimeNumbers::Result2d fit2dResult;
fit2dResult = PrimeNumbers::fitMaxPrime2d(primeNumber3, primeNumber4, maxWgSize);
size_t globalSize[] = {primeNumber, primeNumber2};
size_t localSize[] = {fit2dResult.Val1, fit2dResult.Val2};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_2d_three_prime_numbers_basic
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize/2, maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
unsigned int primeNumber2 = 42967;
unsigned int primeNumber3 = 13;
size_t globalSize[] = {primeNumber2, primeNumber3};
size_t localSize[] = {primeNumber, 1};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
return exec.status();
}
int
test_non_uniform_2d_atomics(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
{
SubTestExecutor exec(device, context, queue);
size_t maxWgSize;
int err;
err = exec.calculateWorkGroupSize(maxWgSize, Range::ATOMICS);
if (err) {
log_error ("Cannot calculate work group size.");
return -1;
}
// non_uniform_2d_max_wg_size_plus_1_atomics
{
size_t globalSize[] = {maxWgSize+1, maxWgSize};
size_t localSize[] = {maxWgSize, 1};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_2d_prime_number_atomics
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
size_t globalSize[] = {primeNumber, maxWgSize};
size_t localSize[] = {maxWgSize/2, 2};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_2d_two_prime_numbers_atomics
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
int primeNumber2 = 1759;
size_t globalSize[] = {primeNumber2, primeNumber};
size_t localSize[] = {16, maxWgSize/16};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_2d_prime_number_atomics_2
{
int primeNumber = 1327;
size_t globalSize[] = {primeNumber, primeNumber};
size_t localSize[] = {maxWgSize/32, 32};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_2d_combination_of_max_wg_size_atomics
{
size_t globalSize[] = {maxWgSize + 2, maxWgSize + 4};
size_t localSize[] = {maxWgSize/32, 32};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_2d_two_prime_numbers_and_ls_null_atomics
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
unsigned int primeNumber2 = 1669;
size_t globalSize[] = {primeNumber, primeNumber2};
size_t *localSize = NULL;
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_2d_prime_number_and_ls_null_atomics
{
unsigned int primeNumber = 1249;
size_t globalSize[] = {primeNumber, primeNumber};
size_t *localSize = NULL;
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_2d_four_prime_numbers_atomics
{
unsigned int primeNumber = 1951;
unsigned int primeNumber2 = 911;
unsigned int primeNumber3 = 13;
unsigned int primeNumber4 = 17;
PrimeNumbers::Result2d fit2dResult;
fit2dResult = PrimeNumbers::fitMaxPrime2d(primeNumber3, primeNumber4, maxWgSize);
size_t globalSize[] = {primeNumber, primeNumber2};
size_t localSize[] = {fit2dResult.Val1, fit2dResult.Val2};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_2d_three_prime_numbers_atomics
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize/2, maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
unsigned int primeNumber2 = 42967;
unsigned int primeNumber3 = 13;
size_t globalSize[] = {primeNumber2, primeNumber3};
size_t localSize[] = {primeNumber, 1};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
return exec.status();
}
int
test_non_uniform_2d_barriers(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
{
SubTestExecutor exec(device, context, queue);
size_t maxWgSize;
int err;
err = exec.calculateWorkGroupSize(maxWgSize, Range::BARRIERS);
if (err) {
log_error ("Cannot calculate work group size.");
return -1;
}
// non_uniform_2d_max_wg_size_plus_1_barriers
{
size_t globalSize[] = {maxWgSize+1, maxWgSize};
size_t localSize[] = {maxWgSize, 1};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_2d_prime_number_barriers
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
size_t globalSize[] = {primeNumber, maxWgSize};
size_t localSize[] = {maxWgSize/2, 2};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_2d_two_prime_numbers_barriers
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
int primeNumber2 = 1759;
size_t globalSize[] = {primeNumber2, primeNumber};
size_t localSize[] = {16, maxWgSize/16};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_2d_prime_number_barriers_2
{
int primeNumber = 1327;
size_t globalSize[] = {primeNumber, primeNumber};
size_t localSize[] = {maxWgSize/32, 32};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_2d_combination_of_max_wg_size_barriers
{
size_t globalSize[] = {maxWgSize + 2, maxWgSize + 4};
size_t localSize[] = {maxWgSize/32, 32};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_2d_two_prime_numbers_and_ls_null_barriers
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
unsigned int primeNumber2 = 1669;
size_t globalSize[] = {primeNumber, primeNumber2};
size_t *localSize = NULL;
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_2d_prime_number_and_ls_null_barriers
{
unsigned int primeNumber = 1249;
size_t globalSize[] = {primeNumber, primeNumber};
size_t *localSize = NULL;
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_2d_four_prime_numbers_barriers
{
unsigned int primeNumber = 1951;
unsigned int primeNumber2 = 911;
unsigned int primeNumber3 = 13;
unsigned int primeNumber4 = 17;
PrimeNumbers::Result2d fit2dResult;
fit2dResult = PrimeNumbers::fitMaxPrime2d(primeNumber3, primeNumber4, maxWgSize);
size_t globalSize[] = {primeNumber, primeNumber2};
size_t localSize[] = {fit2dResult.Val1, fit2dResult.Val2};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_2d_three_prime_numbers_barriers
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize/2, maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
unsigned int primeNumber2 = 42967;
unsigned int primeNumber3 = 13;
size_t globalSize[] = {primeNumber2, primeNumber3};
size_t localSize[] = {primeNumber, 1};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
return exec.status();
}

View File

@@ -0,0 +1,410 @@
//
// Copyright (c) 2017 The Khronos Group Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#include "procs.h"
#include "tools.h"
#include "TestNonUniformWorkGroup.h"
int
test_non_uniform_3d_basic(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
{
SubTestExecutor exec(device, context, queue);
size_t maxWgSize;
int err;
err = exec.calculateWorkGroupSize(maxWgSize, Range::BASIC);
if (err) {
log_error ("Cannot calculate work group size.");
return -1;
}
// non_uniform_3d_max_wg_size_plus_1_basic
{
size_t globalSize[] = {maxWgSize+1, maxWgSize/24, maxWgSize/24};
size_t localSize[] = {maxWgSize, 1, 1};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_3d_prime_number_basic
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
size_t globalSize[] = {maxWgSize/25, primeNumber, maxWgSize/25};
size_t localSize[] = {2, std::max<size_t>(maxWgSize/4,1), 2};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_3d_two_prime_numbers_basic
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
int primeNumber2 = 13;
size_t globalSize[] = {primeNumber2, maxWgSize/8, primeNumber};
size_t localSize[] = {8, 4, std::max<size_t>(maxWgSize/32,1)};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_3d_prime_number_basic_2
{
int primeNumber = 113;
size_t globalSize[] = {primeNumber, primeNumber, primeNumber};
size_t localSize[] = {8, std::max<size_t>(maxWgSize/32,1), 4};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_3d_two_prime_numbers_and_ls_null_basic
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
unsigned int primeNumber2 = 23;
size_t globalSize[] = {primeNumber, primeNumber2, maxWgSize/16};
size_t *localSize = NULL;
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_3d_prime_number_and_ls_null_basic
{
unsigned int primeNumber = 113;
size_t globalSize[] = {primeNumber, primeNumber, primeNumber};
size_t *localSize = NULL;
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_3d_three_prime_numbers_basic
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize/2, maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
unsigned int primeNumber2 = 10711;
unsigned int primeNumber3 = 13;
size_t globalSize[] = {primeNumber2, primeNumber3, primeNumber3};
size_t localSize[] = {primeNumber, 1, 1};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_3d_four_prime_numbers_basic
{
unsigned int primeNumber = 541;
unsigned int primeNumber2 = 251;
unsigned int primeNumber3 = 13;
unsigned int primeNumber4 = 17;
PrimeNumbers::Result2d fit2dResult;
fit2dResult = PrimeNumbers::fitMaxPrime2d(primeNumber3, primeNumber4, maxWgSize);
size_t globalSize[] = {primeNumber, primeNumber2, primeNumber3};
size_t localSize[] = {fit2dResult.Val1, fit2dResult.Val2, 1};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_3d_six_prime_numbers_basic
{
unsigned int primeNumber = 373;
unsigned int primeNumber2 = 13;
unsigned int primeNumber3 = 279;
unsigned int primeNumber4 = 3;
unsigned int primeNumber5 = 5;
unsigned int primeNumber6 = 7;
PrimeNumbers::Result3d fit3dResult;
fit3dResult = PrimeNumbers::fitMaxPrime3d(primeNumber4,primeNumber5,primeNumber6,maxWgSize );
size_t globalSize[] = {primeNumber, primeNumber2, primeNumber3};
size_t localSize[] = {fit3dResult.Val1, fit3dResult.Val2, fit3dResult.Val3};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
return exec.status();
}
int
test_non_uniform_3d_atomics(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
{
SubTestExecutor exec(device, context, queue);
size_t maxWgSize;
int err;
err = exec.calculateWorkGroupSize(maxWgSize, Range::ATOMICS);
if (err) {
log_error ("Cannot calculate work group size.");
return -1;
}
// non_uniform_3d_max_wg_size_plus_1_atomics
{
size_t globalSize[] = {maxWgSize+1, maxWgSize/24, maxWgSize/24};
size_t localSize[] = {maxWgSize, 1, 1};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_3d_prime_number_atomics
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
size_t globalSize[] = {maxWgSize/25, primeNumber, maxWgSize/25};
size_t localSize[] = {2, std::max<size_t>(maxWgSize/4,1), 2};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_3d_two_prime_numbers_atomics
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
int primeNumber2 = 13;
size_t globalSize[] = {primeNumber2, maxWgSize/8, primeNumber};
size_t localSize[] = {8, 4, std::max<size_t>(maxWgSize/32,1)};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_3d_prime_number_atomics_2
{
int primeNumber = 113;
size_t globalSize[] = {primeNumber, primeNumber, primeNumber};
size_t localSize[] = {8, std::max<size_t>(maxWgSize/32,1), 4};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_3d_two_prime_numbers_and_ls_null_atomics
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
unsigned int primeNumber2 = 23;
size_t globalSize[] = {primeNumber, primeNumber2, maxWgSize/16};
size_t *localSize = NULL;
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_3d_prime_number_and_ls_null_atomics
{
unsigned int primeNumber = 113;
size_t globalSize[] = {primeNumber, primeNumber, primeNumber};
size_t *localSize = NULL;
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_3d_three_prime_numbers_atomics
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize/2, maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
unsigned int primeNumber2 = 10711;
unsigned int primeNumber3 = 13;
size_t globalSize[] = {primeNumber2, primeNumber3, primeNumber3};
size_t localSize[] = {primeNumber, 1, 1};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_3d_four_prime_numbers_atomics
{
unsigned int primeNumber = 541;
unsigned int primeNumber2 = 251;
unsigned int primeNumber3 = 13;
unsigned int primeNumber4 = 17;
PrimeNumbers::Result2d fit2dResult;
fit2dResult = PrimeNumbers::fitMaxPrime2d(primeNumber3, primeNumber4, maxWgSize);
size_t globalSize[] = {primeNumber, primeNumber2, primeNumber3};
size_t localSize[] = {fit2dResult.Val1, fit2dResult.Val2, 1};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_3d_six_prime_numbers_atomics
{
unsigned int primeNumber = 373;
unsigned int primeNumber2 = 13;
unsigned int primeNumber3 = 279;
unsigned int primeNumber4 = 3;
unsigned int primeNumber5 = 5;
unsigned int primeNumber6 = 7;
PrimeNumbers::Result3d fit3dResult;
fit3dResult = PrimeNumbers::fitMaxPrime3d(primeNumber4, primeNumber5, primeNumber6, maxWgSize);
size_t globalSize[] = {primeNumber, primeNumber2, primeNumber3};
size_t localSize[] = {fit3dResult.Val1, fit3dResult.Val2, fit3dResult.Val3};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
return exec.status();
}
int
test_non_uniform_3d_barriers(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
{
SubTestExecutor exec(device, context, queue);
size_t maxWgSize;
int err;
err = exec.calculateWorkGroupSize(maxWgSize, Range::BARRIERS);
if (err) {
log_error ("Cannot calculate work group size.");
return -1;
}
// non_uniform_3d_max_wg_size_plus_1_barriers
{
size_t globalSize[] = {maxWgSize+1, maxWgSize/24, maxWgSize/24};
size_t localSize[] = {maxWgSize, 1, 1};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_3d_prime_number_barriers
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
size_t globalSize[] = {maxWgSize/25, primeNumber, maxWgSize/25};
size_t localSize[] = {2, std::max<size_t>(maxWgSize/4,1), 2};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_3d_two_prime_numbers_barriers
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
int primeNumber2 = 13;
size_t globalSize[] = {primeNumber2, maxWgSize/8, primeNumber};
size_t localSize[] = {8, 4, std::max<size_t>(maxWgSize/32,1)};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_3d_prime_number_barriers_2
{
int primeNumber = 113;
size_t globalSize[] = {primeNumber, primeNumber, primeNumber};
size_t localSize[] = {8, std::max<size_t>(maxWgSize/32,1), 4};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_3d_two_prime_numbers_and_ls_null_barriers
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
unsigned int primeNumber2 = 23;
size_t globalSize[] = {primeNumber, primeNumber2, maxWgSize/16};
size_t *localSize = NULL;
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_3d_prime_number_and_ls_null_barriers
{
unsigned int primeNumber = 113;
size_t globalSize[] = {primeNumber, primeNumber, primeNumber};
size_t *localSize = NULL;
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_3d_three_prime_numbers_barriers
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize/2, maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
unsigned int primeNumber2 = 10711;
unsigned int primeNumber3 = 13;
size_t globalSize[] = {primeNumber2, primeNumber3, primeNumber3};
size_t localSize[] = {primeNumber, 1, 1};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_3d_four_prime_numbers_barriers
{
unsigned int primeNumber = 541;
unsigned int primeNumber2 = 251;
unsigned int primeNumber3 = 13;
unsigned int primeNumber4 = 17;
PrimeNumbers::Result2d fit2dResult;
fit2dResult = PrimeNumbers::fitMaxPrime2d(primeNumber3, primeNumber4, maxWgSize);
size_t globalSize[] = {primeNumber, primeNumber2, primeNumber3};
size_t localSize[] = {fit2dResult.Val1, fit2dResult.Val2, 1};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_3d_six_prime_numbers_barriers
{
unsigned int primeNumber = 373;
unsigned int primeNumber2 = 13;
unsigned int primeNumber3 = 279;
unsigned int primeNumber4 = 3;
unsigned int primeNumber5 = 5;
unsigned int primeNumber6 = 7;
PrimeNumbers::Result3d fit3dResult;
fit3dResult = PrimeNumbers::fitMaxPrime3d(primeNumber4,primeNumber5,primeNumber6,maxWgSize );
size_t globalSize[] = {primeNumber, primeNumber2, primeNumber3};
size_t localSize[] = {fit3dResult.Val1, fit3dResult.Val2, fit3dResult.Val3};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
return exec.status();
}

View File

@@ -0,0 +1,279 @@
//
// Copyright (c) 2017 The Khronos Group Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#include "procs.h"
#include "tools.h"
#include "TestNonUniformWorkGroup.h"
int
test_non_uniform_other_basic(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
{
SubTestExecutor exec(device, context, queue);
size_t maxWgSize;
int err;
err = exec.calculateWorkGroupSize(maxWgSize, Range::BASIC);
if (err) {
log_error ("Cannot calculate work group size.");
return -1;
}
// non_uniform_1d_two_prime_numbers_offset_basic
{
unsigned int primeNumber = 42967;
unsigned int primeNumber2 = 113;
PrimeNumbers::Result1d fit1dResult;
fit1dResult = PrimeNumbers::fitMaxPrime1d(primeNumber2, maxWgSize );
size_t globalSize[] = {primeNumber};
size_t localSize[] = {fit1dResult.Val1};
size_t offset[] = {23};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, offset, NULL, Range::BASIC);
}
// non_uniform_2d_three_prime_numbers_offset_basic
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize/2, maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
unsigned int primeNumber2 = 42967;
unsigned int primeNumber3 = 13;
size_t globalSize[] = {primeNumber2, primeNumber3};
size_t localSize[] = {primeNumber, 1};
size_t offset[] = {23, 17};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, offset, NULL, Range::BASIC);
}
// non_uniform_3d_six_prime_numbers_offset_basic
{
unsigned int primeNumber = 373;
unsigned int primeNumber2 = 13;
unsigned int primeNumber3 = 279;
unsigned int primeNumber4 = 3;
unsigned int primeNumber5 = 5;
unsigned int primeNumber6 = 7;
PrimeNumbers::Result3d fit3dResult;
size_t globalSize[] = {primeNumber, primeNumber2, primeNumber3};
fit3dResult = PrimeNumbers::fitMaxPrime3d(primeNumber4, primeNumber5, primeNumber6, maxWgSize );
size_t localSize[] = {fit3dResult.Val1, fit3dResult.Val2, fit3dResult.Val3};
size_t offset[] = {11, 23, 17};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, offset, NULL, Range::BASIC);
}
// non_uniform_3d_six_prime_numbers_rwgs_basic
{
unsigned int primeNumber = 373;
unsigned int primeNumber2 = 13;
unsigned int primeNumber3 = 279;
unsigned int primeNumber4 = 3;
unsigned int primeNumber5 = 5;
unsigned int primeNumber6 = 7;
PrimeNumbers::Result3d fit3dResult;
fit3dResult = PrimeNumbers::fitMaxPrime3d(primeNumber4, primeNumber5, primeNumber6, maxWgSize );
size_t globalSize[] = {primeNumber, primeNumber2, primeNumber3};
size_t localSize[] = {fit3dResult.Val1, fit3dResult.Val2, fit3dResult.Val3};
size_t reqdWorkGroupSize[] = {fit3dResult.Val1, fit3dResult.Val2, fit3dResult.Val3};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, NULL, reqdWorkGroupSize, Range::BASIC);
}
return exec.status();
}
int
test_non_uniform_other_atomics(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
{
SubTestExecutor exec(device, context, queue);
size_t maxWgSize;
int err;
err = exec.calculateWorkGroupSize(maxWgSize, Range::ATOMICS);
if (err) {
log_error ("Cannot calculate work group size.");
return -1;
}
// non_uniform_1d_two_prime_numbers_offset_atomics
{
unsigned int primeNumber = 42967;
unsigned int primeNumber2 = 113;
PrimeNumbers::Result1d fit1dResult;
fit1dResult = PrimeNumbers::fitMaxPrime1d(primeNumber2, maxWgSize );
size_t globalSize[] = {primeNumber};
size_t localSize[] = {fit1dResult.Val1};
size_t offset[] = {23};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, offset, NULL, Range::ATOMICS);
}
// non_uniform_2d_three_prime_numbers_offset_atomics
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize/2, maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
unsigned int primeNumber2 = 42967;
unsigned int primeNumber3 = 13;
size_t globalSize[] = {primeNumber2, primeNumber3};
size_t localSize[] = {primeNumber, 1};
size_t offset[] = {23, 17};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, offset, NULL, Range::ATOMICS);
}
// non_uniform_3d_six_prime_numbers_offset_atomics
{
unsigned int primeNumber = 373;
unsigned int primeNumber2 = 13;
unsigned int primeNumber3 = 279;
unsigned int primeNumber4 = 3;
unsigned int primeNumber5 = 5;
unsigned int primeNumber6 = 7;
PrimeNumbers::Result3d fit3dResult;
fit3dResult = PrimeNumbers::fitMaxPrime3d(primeNumber4, primeNumber5, primeNumber6, maxWgSize );
size_t globalSize[] = {primeNumber, primeNumber2, primeNumber3};
size_t localSize[] = {fit3dResult.Val1, fit3dResult.Val2, fit3dResult.Val3};
size_t offset[] = {11, 23, 17};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, offset, NULL, Range::ATOMICS);
}
// non_uniform_3d_six_prime_numbers_rwgs_atomics
{
unsigned int primeNumber = 373;
unsigned int primeNumber2 = 13;
unsigned int primeNumber3 = 279;
unsigned int primeNumber4 = 3;
unsigned int primeNumber5 = 5;
unsigned int primeNumber6 = 7;
PrimeNumbers::Result3d fit3dResult;
fit3dResult = PrimeNumbers::fitMaxPrime3d(primeNumber4, primeNumber5, primeNumber6, maxWgSize );
size_t globalSize[] = {primeNumber, primeNumber2, primeNumber3};
size_t localSize[] = {fit3dResult.Val1, fit3dResult.Val2, fit3dResult.Val3};
size_t reqdWorkGroupSize[] = {fit3dResult.Val1, fit3dResult.Val2, fit3dResult.Val3};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, NULL, reqdWorkGroupSize, Range::ATOMICS);
}
return exec.status();
}
int
test_non_uniform_other_barriers(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
{
SubTestExecutor exec(device, context, queue);
size_t maxWgSize;
int err;
err = exec.calculateWorkGroupSize(maxWgSize, Range::BARRIERS);
if (err) {
log_error ("Cannot calculate work group size.");
return -1;
}
// non_uniform_1d_two_prime_numbers_offset_barriers
{
unsigned int primeNumber = 42967;
unsigned int primeNumber2 = 113;
PrimeNumbers::Result1d fit1dResult;
fit1dResult = PrimeNumbers::fitMaxPrime1d(primeNumber2, maxWgSize );
size_t globalSize[] = {primeNumber};
size_t localSize[] = {fit1dResult.Val1};
size_t offset[] = {23};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, offset, NULL, Range::BARRIERS);
}
// non_uniform_2d_three_prime_numbers_offset_barriers
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize/2, maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
unsigned int primeNumber2 = 42967;
unsigned int primeNumber3 = 13;
size_t globalSize[] = {primeNumber2, primeNumber3};
size_t localSize[] = {primeNumber, 1};
size_t offset[] = {23, 17};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, offset, NULL, Range::BARRIERS);
}
// non_uniform_3d_six_prime_numbers_offset_barriers
{
unsigned int primeNumber = 373;
unsigned int primeNumber2 = 13;
unsigned int primeNumber3 = 279;
unsigned int primeNumber4 = 3;
unsigned int primeNumber5 = 5;
unsigned int primeNumber6 = 7;
PrimeNumbers::Result3d fit3dResult;
fit3dResult = PrimeNumbers::fitMaxPrime3d(primeNumber4, primeNumber5, primeNumber6, maxWgSize );
size_t globalSize[] = {primeNumber, primeNumber2, primeNumber3};
size_t localSize[] = {fit3dResult.Val1, fit3dResult.Val2, fit3dResult.Val3};
size_t offset[] = {11, 23, 17};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, offset, NULL, Range::BARRIERS);
}
// non_uniform_3d_six_prime_numbers_rwgs_barriers
{
unsigned int primeNumber = 373;
unsigned int primeNumber2 = 13;
unsigned int primeNumber3 = 279;
unsigned int primeNumber4 = 3;
unsigned int primeNumber5 = 5;
unsigned int primeNumber6 = 7;
PrimeNumbers::Result3d fit3dResult;
fit3dResult = PrimeNumbers::fitMaxPrime3d(primeNumber4, primeNumber5, primeNumber6, maxWgSize );
size_t globalSize[] = {primeNumber, primeNumber2, primeNumber3};
size_t localSize[] = {fit3dResult.Val1, fit3dResult.Val2, fit3dResult.Val3};
size_t reqdWorkGroupSize[] = {fit3dResult.Val1, fit3dResult.Val2, fit3dResult.Val3};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, NULL, reqdWorkGroupSize, Range::BARRIERS);
}
return exec.status();
}

View File

@@ -0,0 +1,398 @@
//
// Copyright (c) 2017 The Khronos Group Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#include "procs.h"
#include "tools.h"
#include "TestNonUniformWorkGroup.h"
int
test_non_uniform_1d_basic(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
{
SubTestExecutor exec(device, context, queue);
size_t maxWgSize;
int err;
err = exec.calculateWorkGroupSize(maxWgSize, Range::BASIC);
if (err) {
log_error ("Cannot calculate work group size.");
return -1;
}
// non_uniform_1d_max_wg_size_plus_1_basic
{
size_t globalSize[] = {maxWgSize+1};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_1d_prime_number_basic
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
size_t globalSize[] = {primeNumber};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_1d_max_wg_size_plus_prime_number_basic
{
int primeNumber = 11;
size_t globalSize[] = {maxWgSize+primeNumber};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_1d_max_wg_size_plus_prime_number_basic_2
{
int primeNumber = 53;
size_t globalSize[] = {maxWgSize+primeNumber};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_1d_2max_wg_size_minus_1_basic
{
size_t globalSize[] = {2*maxWgSize - 1};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_1d_prime_number_basic_2
{
unsigned int primeNumber = 20101;
size_t globalSize[] = {primeNumber};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_1d_prime_number_basic_3
{
unsigned int primeNumber = 42967;
size_t globalSize[] = {primeNumber};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_1d_prime_number_basic_4
{
unsigned int primeNumber = 65521;
size_t globalSize[] = {primeNumber};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_1d_prime_number_and_ls_null_basic_2
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
size_t globalSize[] = {primeNumber};
size_t *localSize = NULL;
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_1d_prime_number_and_ls_null_basic_3
{
unsigned int primeNumber = 65521;
size_t globalSize[] = {primeNumber};
size_t *localSize = NULL;
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
// non_uniform_1d_two_prime_numbers_basic
{
unsigned int primeNumber = 42967;
unsigned int primeNumber2 = 113;
PrimeNumbers::Result1d fit1dResult;
fit1dResult = PrimeNumbers::fitMaxPrime1d(primeNumber2, maxWgSize );
size_t globalSize[] = {primeNumber};
size_t localSize[] = {fit1dResult.Val1};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BASIC);
}
return exec.status();
}
int
test_non_uniform_1d_atomics(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
{
SubTestExecutor exec(device, context, queue);
size_t maxWgSize;
int err;
err = exec.calculateWorkGroupSize(maxWgSize, Range::ATOMICS);
if (err) {
log_error ("Cannot calculate work group size.");
return -1;
}
// non_uniform_1d_max_wg_size_plus_1_atomics
{
size_t globalSize[] = {maxWgSize+1};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_1d_prime_number_atomics
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
size_t globalSize[] = {primeNumber};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_1d_max_wg_size_plus_prime_number_atomics
{
int primeNumber = 11;
size_t globalSize[] = {maxWgSize+primeNumber};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_1d_max_wg_size_plus_prime_number_atomics_2
{
int primeNumber = 53;
size_t globalSize[] = {maxWgSize+primeNumber};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_1d_2max_wg_size_minus_1_atomics
{
size_t globalSize[] = {2*maxWgSize - 1};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_1d_prime_number_atomics_2
{
unsigned int primeNumber = 20101;
size_t globalSize[] = {primeNumber};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_1d_prime_number_atomics_3
{
unsigned int primeNumber = 42967;
size_t globalSize[] = {primeNumber};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_1d_prime_number_atomics_4
{
unsigned int primeNumber = 65521;
size_t globalSize[] = {primeNumber};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_1d_prime_number_and_ls_null_atomics_2
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
size_t globalSize[] = {primeNumber};
size_t *localSize = NULL;
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_1d_prime_number_and_ls_null_atomics_3
{
unsigned int primeNumber = 65521;
size_t globalSize[] = {primeNumber};
size_t *localSize = NULL;
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
// non_uniform_1d_two_prime_numbers_atomics
{
unsigned int primeNumber = 42967;
unsigned int primeNumber2 = 113;
PrimeNumbers::Result1d fit1dResult;
fit1dResult = PrimeNumbers::fitMaxPrime1d(primeNumber2, maxWgSize );
size_t globalSize[] = {primeNumber};
size_t localSize[] = {fit1dResult.Val1};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::ATOMICS);
}
return exec.status();
}
int
test_non_uniform_1d_barriers(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
{
SubTestExecutor exec(device, context, queue);
size_t maxWgSize;
int err;
err = exec.calculateWorkGroupSize(maxWgSize, Range::BARRIERS);
if (err) {
log_error ("Cannot calculate work group size.");
return -1;
}
// non_uniform_1d_max_wg_size_plus_1_barriers
{
size_t globalSize[] = {maxWgSize+1};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_1d_prime_number_barriers
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
size_t globalSize[] = {primeNumber};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_1d_max_wg_size_plus_prime_number_barriers
{
int primeNumber = 11;
size_t globalSize[] = {maxWgSize+primeNumber};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_1d_max_wg_size_plus_prime_number_barriers_2
{
int primeNumber = 53;
size_t globalSize[] = {maxWgSize+primeNumber};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_1d_2max_wg_size_minus_1_barriers
{
size_t globalSize[] = {2*maxWgSize - 1};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_1d_prime_number_barriers_2
{
unsigned int primeNumber = 20101;
size_t globalSize[] = {primeNumber};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_1d_prime_number_barriers_3
{
unsigned int primeNumber = 42967;
size_t globalSize[] = {primeNumber};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_1d_prime_number_barriers_4
{
unsigned int primeNumber = 65521;
size_t globalSize[] = {primeNumber};
size_t localSize[] = {maxWgSize};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_1d_prime_number_and_ls_null_barriers_2
{
int primeNumber = PrimeNumbers::getPrimeNumberInRange(maxWgSize, 2*maxWgSize);
if (primeNumber < 1) {
log_error ("Cannot find proper prime number.");
return -1;
}
size_t globalSize[] = {primeNumber};
size_t *localSize = NULL;
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_1d_prime_number_and_ls_null_barriers_3
{
unsigned int primeNumber = 65521;
size_t globalSize[] = {primeNumber};
size_t *localSize = NULL;
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
// non_uniform_1d_two_prime_numbers_barriers
{
unsigned int primeNumber = 42967;
unsigned int primeNumber2 = 113;
PrimeNumbers::Result1d fit1dResult;
fit1dResult = PrimeNumbers::fitMaxPrime1d(primeNumber2, maxWgSize );
size_t globalSize[] = {primeNumber};
size_t localSize[] = {fit1dResult.Val1};
exec.runTestNonUniformWorkGroup(sizeof(globalSize)/sizeof(globalSize[0]), globalSize, localSize, Range::BARRIERS);
}
return exec.status();
}

View File

@@ -0,0 +1,274 @@
//
// Copyright (c) 2017 The Khronos Group Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#include "tools.h"
#include <sstream>
#include "../../test_common/harness/errorHelpers.h"
PrimeNumbersCollection PrimeNumbers::primeNumbers;
// Method generates prime numbers using Sieve of Eratosthenes algorithm
void PrimeNumbers::generatePrimeNumbers (unsigned int maxValue) {
primeNumbers.clear();
for (unsigned int i=2; i < maxValue; i++)
primeNumbers.push_back(i);
PrimeNumbersCollection::iterator it, it2;
it = primeNumbers.begin();
it2 = primeNumbers.begin();
unsigned int maxValueSqrt = (unsigned int)sqrt((double)maxValue);
for (; it != primeNumbers.end(); it++) {
it2 = it;
++it2;
if(*it>maxValueSqrt)
break;
for (;it2 != primeNumbers.end();)
if (*it2 % *it == 0)
it2 = primeNumbers.erase(it2);
else
++it2;
}
}
// Returns prime number for specified range
int PrimeNumbers::getPrimeNumberInRange (size_t lowerValue, size_t higherValue) {
if(lowerValue >= higherValue)
return -1;
if(primeNumbers.back() < lowerValue)
return -2;
PrimeNumbersCollection::iterator it = primeNumbers.begin();
for (; it != primeNumbers.end(); ++it) {
if (lowerValue<*it) {
if(higherValue>*it)
return *it;
else
return -3;
}
}
return -1;
}
int PrimeNumbers::getNextLowerPrimeNumber(size_t upperValue) {
size_t retVal = 1;
PrimeNumbersCollection::iterator it = primeNumbers.begin();
for (; it != primeNumbers.end(); ++it) {
if (upperValue > *it) {
retVal = *it;
} else {
break;
}
}
return retVal;
}
PrimeNumbers::Result1d PrimeNumbers::fitMaxPrime1d(size_t val1, size_t maxVal){
PrimeNumbers::Result1d result;
if (maxVal == 1) {
result.Val1 = 1;
return result;
}
while(val1 > maxVal)
{
val1 = PrimeNumbers::getNextLowerPrimeNumber(val1);
}
result.Val1 = val1;
return result;
}
PrimeNumbers::Result2d PrimeNumbers::fitMaxPrime2d(size_t val1, size_t val2, size_t productMax) {
PrimeNumbers::Result2d result;
if (productMax == 1) {
result.Val1 = 1;
result.Val2 = 1;
return result;
}
while ((val2 * val1) > productMax) {
if ((val2 > val1) && (val2 > 1)) {
val2 = PrimeNumbers::getNextLowerPrimeNumber(val2);
continue;
}
if (val1 > 1) {
val1 = PrimeNumbers::getNextLowerPrimeNumber(val1);
continue;
}
break;
}
result.Val1 = val1;
result.Val2 = val2;
return result;
}
PrimeNumbers::Result3d PrimeNumbers::fitMaxPrime3d(size_t val1, size_t val2, size_t val3, size_t productMax) {
Result3d result;
if (productMax == 1) {
result.Val1 = 1;
result.Val2 = 1;
result.Val3 = 1;
return result;
}
while ((val3 * val2 * val1) > productMax) {
if ((val3 > val2) && (val3 > val1) && (val3 > 1)) {
val3 = PrimeNumbers::getNextLowerPrimeNumber(val3);
continue;
}
if ((val2 > val1) && (val2 > 1)) {
val2 = PrimeNumbers::getNextLowerPrimeNumber(val2);
continue;
}
if (val1 > 1) {
val1 = PrimeNumbers::getNextLowerPrimeNumber(val1);
continue;
}
break;
}
result.Val1 = val1;
result.Val2 = val2;
result.Val3 = val3;
return result;
}
namespace Error {
ErrorMap::value_type rawDataErrorString[] = {
ErrorMap::value_type(ERR_GLOBAL_SIZE, "global size"),
ErrorMap::value_type(ERR_GLOBAL_WORK_OFFSET, "global work offset"),
ErrorMap::value_type(ERR_LOCAL_SIZE, "local size"),
ErrorMap::value_type(ERR_GLOBAL_ID, "global id"),
ErrorMap::value_type(ERR_LOCAL_ID, "local id"),
ErrorMap::value_type(ERR_ENQUEUED_LOCAL_SIZE, "enqueued local size"),
ErrorMap::value_type(ERR_LOCAL_SIZE, "local size"),
ErrorMap::value_type(ERR_NUM_GROUPS, "num groups"),
ErrorMap::value_type(ERR_GROUP_ID, "group id"),
ErrorMap::value_type(ERR_WORK_DIM, "work dim"),
ErrorMap::value_type(ERR_GLOBAL_BARRIER, "global barrier"),
ErrorMap::value_type(ERR_LOCAL_BARRIER, "local barrier"),
ErrorMap::value_type(ERR_GLOBAL_ATOMIC, "global atomic"),
ErrorMap::value_type(ERR_LOCAL_ATOMIC, "local atomic"),
ErrorMap::value_type(ERR_STRICT_MODE, "strict requirements failed. Wrong local work group size"),
ErrorMap::value_type(ERR_BUILD_STATUS, "build status"),
ErrorMap::value_type(ERR_UNKNOWN, "[unknown]"),
ErrorMap::value_type(ERR_DIFFERENT, "[different]"),
};
const int numElems = sizeof(rawDataErrorString)/sizeof(rawDataErrorString[0]);
ErrorMap errorString (rawDataErrorString, rawDataErrorString+numElems);
ErrorClass::ErrorClass() {
_overallNumberOfErrors = 0;
_stats.clear();
for (unsigned short i=0; i<sizeof(_errorArrayCounter)/sizeof(_errorArrayCounter[0]); i++) {
_errorArrayCounter[i] = 0;
}
}
void ErrorClass::show(Type err, std::string where, std::string additionalInfo) {
++_overallNumberOfErrors;
err = (errorString.find(err) == errorString.end())?ERR_UNKNOWN:err;
++_stats[err];
if (_overallNumberOfErrors == MAX_NUMBER_OF_PRINTED_ERRORS)
printError("\t. . . Too many errors. Application will skip printing them.");
if (_overallNumberOfErrors >= MAX_NUMBER_OF_PRINTED_ERRORS)
return;
std::string errString = "Error ";
errString += errorString[err];
errString += " appeared";
if(where.compare("") != 0) {
errString += " in ";
errString += where;
}
if(additionalInfo.compare("") != 0) {
errString += " ";
errString += additionalInfo;
}
printError(errString);
}
void ErrorClass::show(Type whatErr, std::string where, cl_ulong valueIs, cl_ulong valueExpected) {
std::ostringstream tmp;
tmp << "(is: " << valueIs << ", expected: " << valueExpected << ")";
show(whatErr, where, tmp.str());
}
void ErrorClass::show(std::string description) {
++_overallNumberOfErrors;
++_stats[ERR_DIFFERENT];
if (_overallNumberOfErrors < MAX_NUMBER_OF_PRINTED_ERRORS)
printError(description);
if (_overallNumberOfErrors == MAX_NUMBER_OF_PRINTED_ERRORS)
printError("\t. . . Too many errors. Application will skip printing them.");
}
void ErrorClass::printError(std::string errString) {
log_error ("%s\n", errString.c_str());
}
void ErrorClass::showStats() {
Type err;
log_info ("T E S T S U M M A R Y:\n");
for (ErrorStats::iterator it = _stats.begin(); it != _stats.end(); it++) {
err = (errorString.find(it->first) == errorString.end())?ERR_UNKNOWN:it->first;
std::string errName = errorString[err];
log_info("Error %s:\t%d\n", errName.c_str(), it->second);
}
log_info("Overall number of errors:\t%d\n", _overallNumberOfErrors);
}
bool ErrorClass::checkError() {
return _overallNumberOfErrors > 0;
}
// This method is required to synchronize errors counters between kernel and host
void ErrorClass::synchronizeStatsMap() {
for (unsigned short i=0; i<sizeof(_errorArrayCounter)/sizeof(_errorArrayCounter[0]); i++) {
if(_errorArrayCounter[i] == 0)
continue;
_stats[static_cast<Type>(i)] += _errorArrayCounter[i];
_overallNumberOfErrors += _errorArrayCounter[i];
}
}
}

View File

@@ -0,0 +1,109 @@
//
// Copyright (c) 2017 The Khronos Group Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#ifndef _TOOLS_H
#define _TOOLS_H
#include "procs.h"
#include <vector>
#include <map>
#include <string>
typedef std::vector<unsigned int> PrimeNumbersCollection;
// Class responsible for distributing prime numbers
class PrimeNumbers {
public:
struct Result1d{
size_t Val1;
};
struct Result2d{
size_t Val1;
size_t Val2;
};
struct Result3d{
size_t Val1;
size_t Val2;
size_t Val3;
};
static void generatePrimeNumbers (unsigned int maxValue);
static int getPrimeNumberInRange (size_t lowerValue, size_t higherValue);
static int getNextLowerPrimeNumber (size_t upperValue);
static Result1d fitMaxPrime1d(size_t Val1, size_t productMax);
// Return val1 and Val2 which are largest prime numbers who's product is <= productMax
static Result2d fitMaxPrime2d(size_t Val1, size_t Val2, size_t productMax);
// Return val1, val2 and val3, which are largest prime numbers who's product is <= productMax
static Result3d fitMaxPrime3d(size_t Val1, size_t Val2, size_t Val3, size_t productMax);
private:
static PrimeNumbersCollection primeNumbers;
PrimeNumbers();
};
// Stores information about errors
namespace Error {
#define MAX_NUMBER_OF_PRINTED_ERRORS 10
enum Type{
ERR_GLOBAL_SIZE=0,
ERR_GLOBAL_WORK_OFFSET,
ERR_LOCAL_SIZE,
ERR_GLOBAL_ID,
ERR_LOCAL_ID,
ERR_ENQUEUED_LOCAL_SIZE,
ERR_NUM_GROUPS,
ERR_GROUP_ID,
ERR_WORK_DIM,
ERR_GLOBAL_BARRIER,
ERR_LOCAL_BARRIER,
ERR_GLOBAL_ATOMIC,
ERR_LOCAL_ATOMIC,
ERR_STRICT_MODE,
ERR_BUILD_STATUS,
ERR_UNKNOWN,
ERR_DIFFERENT,
_LAST_ELEM
};
typedef std::map<Type, std::string> ErrorMap;
typedef std::map<Type, unsigned int> ErrorStats;
class ErrorClass {
public:
ErrorClass();
void show(Type whatErr, std::string where="", std::string additionalInfo="");
void show(Type whatErr, std::string where, cl_ulong valueIs, cl_ulong valueExpected);
void show(std::string description);
bool checkError();
void showStats();
void synchronizeStatsMap();
cl_uint * errorArrayCounter() {return _errorArrayCounter;};
size_t errorArrayCounterSize() {return sizeof(_errorArrayCounter);};
private:
cl_uint _errorArrayCounter[Error::_LAST_ELEM]; // this buffer is passed to kernel
int _overallNumberOfErrors;
ErrorStats _stats;
void printError(std::string errString);
};
}
#endif // _TOOLS_H