Files
OpenCL-CTS/test_conformance/pipes/test_pipe_read_write.cpp
John Kesapides 094cc04e16 Mem-leaks from conformance pipes (#772)
Fix various memory leaks around events.
Convert test to use supplied typewrappers
to avoid memory leaks. Also use error helper
functions to reduce code size.
Use stringstreams to synthesize kernel sources, and
raw c+11 string literals.

Signed-off-by: John Kesapides <john.kesapides@arm.com>
2020-05-22 13:26:05 +01:00

1671 lines
71 KiB
C++

//
// 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 "harness/compat.h"
#include <assert.h>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <sys/stat.h>
#include <sys/types.h>
#include "procs.h"
#include "kernels.h"
#include "harness/errorHelpers.h"
#ifndef uchar
typedef unsigned char uchar;
#endif
typedef struct{
char a;
int b;
} TestStruct;
#define STRING_LENGTH 1024
static int useWorkgroupReserve = 0;
static int useSubgroupReserve = 0;
static int useConvenienceBuiltIn = 0;
static const char* int_kernel_name[] = { "test_pipe_write_int", "test_pipe_read_int", "test_pipe_write_int2", "test_pipe_read_int2", "test_pipe_write_int4", "test_pipe_read_int4", "test_pipe_write_int8", "test_pipe_read_int8", "test_pipe_write_int16", "test_pipe_read_int16" };
static const char* uint_kernel_name[] = { "test_pipe_write_uint", "test_pipe_read_uint", "test_pipe_write_uint2", "test_pipe_read_uint2", "test_pipe_write_uint4", "test_pipe_read_uint4", "test_pipe_write_uint8", "test_pipe_read_uint8", "test_pipe_write_uint16", "test_pipe_read_uint16" };
static const char* long_kernel_name[] = { "test_pipe_write_long", "test_pipe_read_long", "test_pipe_write_long2", "test_pipe_read_long2", "test_pipe_write_long4", "test_pipe_read_long4", "test_pipe_write_long8", "test_pipe_read_long8", "test_pipe_write_long16", "test_pipe_read_long16" };
static const char* ulong_kernel_name[] = { "test_pipe_write_ulong", "test_pipe_read_ulong", "test_pipe_write_ulong2", "test_pipe_read_ulong2", "test_pipe_write_ulong4", "test_pipe_read_ulong4", "test_pipe_write_ulong8", "test_pipe_read_ulong8", "test_pipe_write_ulong16", "test_pipe_read_ulong16" };
static const char* char_kernel_name[] = { "test_pipe_write_char", "test_pipe_read_char", "test_pipe_write_char2", "test_pipe_read_char2", "test_pipe_write_char4", "test_pipe_read_char4", "test_pipe_write_char8", "test_pipe_read_char8", "test_pipe_write_char16", "test_pipe_read_char16" };
static const char* uchar_kernel_name[] = { "test_pipe_write_uchar", "test_pipe_read_uchar", "test_pipe_write_uchar2", "test_pipe_read_uchar2", "test_pipe_write_uchar4", "test_pipe_read_uchar4", "test_pipe_write_uchar8", "test_pipe_read_uchar8", "test_pipe_write_uchar16", "test_pipe_read_uchar16" };
static const char* short_kernel_name[] = { "test_pipe_write_short", "test_pipe_read_short", "test_pipe_write_short2", "test_pipe_read_short2", "test_pipe_write_short4", "test_pipe_read_short4", "test_pipe_write_short8", "test_pipe_read_short8", "test_pipe_write_short16", "test_pipe_read_short16" };
static const char* ushort_kernel_name[] = { "test_pipe_write_ushort", "test_pipe_read_ushort", "test_pipe_write_ushort2", "test_pipe_read_ushort2", "test_pipe_write_ushort4", "test_pipe_read_ushort4", "test_pipe_write_ushort8", "test_pipe_read_ushort8", "test_pipe_write_ushort16", "test_pipe_read_ushort16" };
static const char* float_kernel_name[] = { "test_pipe_write_float", "test_pipe_read_float", "test_pipe_write_float2", "test_pipe_read_float2", "test_pipe_write_float4", "test_pipe_read_float4", "test_pipe_write_float8", "test_pipe_read_float8", "test_pipe_write_float16", "test_pipe_read_float16" };
static const char* half_kernel_name[] = { "test_pipe_write_half", "test_pipe_read_half", "test_pipe_write_half2", "test_pipe_read_half2", "test_pipe_write_half4", "test_pipe_read_half4", "test_pipe_write_half8", "test_pipe_read_half8", "test_pipe_write_half16", "test_pipe_read_half16" };
static const char* double_kernel_name[] = { "test_pipe_write_double", "test_pipe_read_double", "test_pipe_write_double2", "test_pipe_read_double2", "test_pipe_write_double4", "test_pipe_read_double4", "test_pipe_write_double8", "test_pipe_read_double8", "test_pipe_write_double16", "test_pipe_read_double16" };
static const char* workgroup_int_kernel_name[] = { "test_pipe_workgroup_write_int", "test_pipe_workgroup_read_int", "test_pipe_workgroup_write_int2", "test_pipe_workgroup_read_int2", "test_pipe_workgroup_write_int4", "test_pipe_workgroup_read_int4", "test_pipe_workgroup_write_int8", "test_pipe_workgroup_read_int8", "test_pipe_workgroup_write_int16", "test_pipe_workgroup_read_int16" };
static const char* workgroup_uint_kernel_name[] = { "test_pipe_workgroup_write_uint", "test_pipe_workgroup_read_uint", "test_pipe_workgroup_write_uint2", "test_pipe_workgroup_read_uint2", "test_pipe_workgroup_write_uint4", "test_pipe_workgroup_read_uint4", "test_pipe_workgroup_write_uint8", "test_pipe_workgroup_read_uint8", "test_pipe_workgroup_write_uint16", "test_pipe_workgroup_read_uint16" };
static const char* workgroup_long_kernel_name[] = { "test_pipe_workgroup_write_long", "test_pipe_workgroup_read_long", "test_pipe_workgroup_write_long2", "test_pipe_workgroup_read_long2", "test_pipe_workgroup_write_long4", "test_pipe_workgroup_read_long4", "test_pipe_workgroup_write_long8", "test_pipe_workgroup_read_long8", "test_pipe_workgroup_write_long16", "test_pipe_workgroup_read_long16" };
static const char* workgroup_ulong_kernel_name[] = { "test_pipe_workgroup_write_ulong", "test_pipe_workgroup_read_ulong", "test_pipe_workgroup_write_ulong2", "test_pipe_workgroup_read_ulong2", "test_pipe_workgroup_write_ulong4", "test_pipe_workgroup_read_ulong4", "test_pipe_workgroup_write_ulong8", "test_pipe_workgroup_read_ulong8", "test_pipe_workgroup_write_ulong16", "test_pipe_workgroup_read_ulong16" };
static const char* workgroup_char_kernel_name[] = { "test_pipe_workgroup_write_char", "test_pipe_workgroup_read_char", "test_pipe_workgroup_write_char2", "test_pipe_workgroup_read_char2", "test_pipe_workgroup_write_char4", "test_pipe_workgroup_read_char4", "test_pipe_workgroup_write_char8", "test_pipe_workgroup_read_char8", "test_pipe_workgroup_write_char16", "test_pipe_workgroup_read_char16" };
static const char* workgroup_uchar_kernel_name[] = { "test_pipe_workgroup_write_uchar", "test_pipe_workgroup_read_uchar", "test_pipe_workgroup_write_uchar2", "test_pipe_workgroup_read_uchar2", "test_pipe_workgroup_write_uchar4", "test_pipe_workgroup_read_uchar4", "test_pipe_workgroup_write_uchar8", "test_pipe_workgroup_read_uchar8", "test_pipe_workgroup_write_uchar16", "test_pipe_workgroup_read_uchar16" };
static const char* workgroup_short_kernel_name[] = { "test_pipe_workgroup_write_short", "test_pipe_workgroup_read_short", "test_pipe_workgroup_write_short2", "test_pipe_workgroup_read_short2", "test_pipe_workgroup_write_short4", "test_pipe_workgroup_read_short4", "test_pipe_workgroup_write_short8", "test_pipe_workgroup_read_short8", "test_pipe_workgroup_write_short16", "test_pipe_workgroup_read_short16" };
static const char* workgroup_ushort_kernel_name[] = { "test_pipe_workgroup_write_ushort", "test_pipe_workgroup_read_ushort", "test_pipe_workgroup_write_ushort2", "test_pipe_workgroup_read_ushort2", "test_pipe_workgroup_write_ushort4", "test_pipe_workgroup_read_ushort4", "test_pipe_workgroup_write_ushort8", "test_pipe_workgroup_read_ushort8", "test_pipe_workgroup_write_ushort16", "test_pipe_workgroup_read_ushort16" };
static const char* workgroup_float_kernel_name[] = { "test_pipe_workgroup_write_float", "test_pipe_workgroup_read_float", "test_pipe_workgroup_write_float2", "test_pipe_workgroup_read_float2", "test_pipe_workgroup_write_float4", "test_pipe_workgroup_read_float4", "test_pipe_workgroup_write_float8", "test_pipe_workgroup_read_float8", "test_pipe_workgroup_write_float16", "test_pipe_workgroup_read_float16" };
static const char* workgroup_half_kernel_name[] = { "test_pipe_workgroup_write_half", "test_pipe_workgroup_read_half", "test_pipe_workgroup_write_half2", "test_pipe_workgroup_read_half2", "test_pipe_workgroup_write_half4", "test_pipe_workgroup_read_half4", "test_pipe_workgroup_write_half8", "test_pipe_workgroup_read_half8", "test_pipe_workgroup_write_half16", "test_pipe_workgroup_read_half16" };
static const char* workgroup_double_kernel_name[] = { "test_pipe_workgroup_write_double", "test_pipe_workgroup_read_double", "test_pipe_workgroup_write_double2", "test_pipe_workgroup_read_double2", "test_pipe_workgroup_write_double4", "test_pipe_workgroup_read_double4", "test_pipe_workgroup_write_double8", "test_pipe_workgroup_read_double8", "test_pipe_workgroup_write_double16", "test_pipe_workgroup_read_double16" };
static const char* subgroup_int_kernel_name[] = { "test_pipe_subgroup_write_int", "test_pipe_subgroup_read_int", "test_pipe_subgroup_write_int2", "test_pipe_subgroup_read_int2", "test_pipe_subgroup_write_int4", "test_pipe_subgroup_read_int4", "test_pipe_subgroup_write_int8", "test_pipe_subgroup_read_int8", "test_pipe_subgroup_write_int16", "test_pipe_subgroup_read_int16" };
static const char* subgroup_uint_kernel_name[] = { "test_pipe_subgroup_write_uint", "test_pipe_subgroup_read_uint", "test_pipe_subgroup_write_uint2", "test_pipe_subgroup_read_uint2", "test_pipe_subgroup_write_uint4", "test_pipe_subgroup_read_uint4", "test_pipe_subgroup_write_uint8", "test_pipe_subgroup_read_uint8", "test_pipe_subgroup_write_uint16", "test_pipe_subgroup_read_uint16" };
static const char* subgroup_long_kernel_name[] = { "test_pipe_subgroup_write_long", "test_pipe_subgroup_read_long", "test_pipe_subgroup_write_long2", "test_pipe_subgroup_read_long2", "test_pipe_subgroup_write_long4", "test_pipe_subgroup_read_long4", "test_pipe_subgroup_write_long8", "test_pipe_subgroup_read_long8", "test_pipe_subgroup_write_long16", "test_pipe_subgroup_read_long16" };
static const char* subgroup_ulong_kernel_name[] = { "test_pipe_subgroup_write_ulong", "test_pipe_subgroup_read_ulong", "test_pipe_subgroup_write_ulong2", "test_pipe_subgroup_read_ulong2", "test_pipe_subgroup_write_ulong4", "test_pipe_subgroup_read_ulong4", "test_pipe_subgroup_write_ulong8", "test_pipe_subgroup_read_ulong8", "test_pipe_subgroup_write_ulong16", "test_pipe_subgroup_read_ulong16" };
static const char* subgroup_char_kernel_name[] = { "test_pipe_subgroup_write_char", "test_pipe_subgroup_read_char", "test_pipe_subgroup_write_char2", "test_pipe_subgroup_read_char2", "test_pipe_subgroup_write_char4", "test_pipe_subgroup_read_char4", "test_pipe_subgroup_write_char8", "test_pipe_subgroup_read_char8", "test_pipe_subgroup_write_char16", "test_pipe_subgroup_read_char16" };
static const char* subgroup_uchar_kernel_name[] = { "test_pipe_subgroup_write_uchar", "test_pipe_subgroup_read_uchar", "test_pipe_subgroup_write_uchar2", "test_pipe_subgroup_read_uchar2", "test_pipe_subgroup_write_uchar4", "test_pipe_subgroup_read_uchar4", "test_pipe_subgroup_write_uchar8", "test_pipe_subgroup_read_uchar8", "test_pipe_subgroup_write_uchar16", "test_pipe_subgroup_read_uchar16" };
static const char* subgroup_short_kernel_name[] = { "test_pipe_subgroup_write_short", "test_pipe_subgroup_read_short", "test_pipe_subgroup_write_short2", "test_pipe_subgroup_read_short2", "test_pipe_subgroup_write_short4", "test_pipe_subgroup_read_short4", "test_pipe_subgroup_write_short8", "test_pipe_subgroup_read_short8", "test_pipe_subgroup_write_short16", "test_pipe_subgroup_read_short16" };
static const char* subgroup_ushort_kernel_name[] = { "test_pipe_subgroup_write_ushort", "test_pipe_subgroup_read_ushort", "test_pipe_subgroup_write_ushort2", "test_pipe_subgroup_read_ushort2", "test_pipe_subgroup_write_ushort4", "test_pipe_subgroup_read_ushort4", "test_pipe_subgroup_write_ushort8", "test_pipe_subgroup_read_ushort8", "test_pipe_subgroup_write_ushort16", "test_pipe_subgroup_read_ushort16" };
static const char* subgroup_float_kernel_name[] = { "test_pipe_subgroup_write_float", "test_pipe_subgroup_read_float", "test_pipe_subgroup_write_float2", "test_pipe_subgroup_read_float2", "test_pipe_subgroup_write_float4", "test_pipe_subgroup_read_float4", "test_pipe_subgroup_write_float8", "test_pipe_subgroup_read_float8", "test_pipe_subgroup_write_float16", "test_pipe_subgroup_read_float16" };
static const char* subgroup_half_kernel_name[] = { "test_pipe_subgroup_write_half", "test_pipe_subgroup_read_half", "test_pipe_subgroup_write_half2", "test_pipe_subgroup_read_half2", "test_pipe_subgroup_write_half4", "test_pipe_subgroup_read_half4", "test_pipe_subgroup_write_half8", "test_pipe_subgroup_read_half8", "test_pipe_subgroup_write_half16", "test_pipe_subgroup_read_half16" };
static const char* subgroup_double_kernel_name[] = { "test_pipe_subgroup_write_double", "test_pipe_subgroup_read_double", "test_pipe_subgroup_write_double2", "test_pipe_subgroup_read_double2", "test_pipe_subgroup_write_double4", "test_pipe_subgroup_read_double4", "test_pipe_subgroup_write_double8", "test_pipe_subgroup_read_double8", "test_pipe_subgroup_write_double16", "test_pipe_subgroup_read_double16" };
static const char* convenience_int_kernel_name[] = { "test_pipe_convenience_write_int", "test_pipe_convenience_read_int", "test_pipe_convenience_write_int2", "test_pipe_convenience_read_int2", "test_pipe_convenience_write_int4", "test_pipe_convenience_read_int4", "test_pipe_convenience_write_int8", "test_pipe_convenience_read_int8", "test_pipe_convenience_write_int16", "test_pipe_convenience_read_int16" };
static const char* convenience_uint_kernel_name[] = { "test_pipe_convenience_write_uint", "test_pipe_convenience_read_uint", "test_pipe_convenience_write_uint2", "test_pipe_convenience_read_uint2", "test_pipe_convenience_write_uint4", "test_pipe_convenience_read_uint4", "test_pipe_convenience_write_uint8", "test_pipe_convenience_read_uint8", "test_pipe_convenience_write_uint16", "test_pipe_convenience_read_uint16" };
static const char* convenience_long_kernel_name[] = { "test_pipe_convenience_write_long", "test_pipe_convenience_read_long", "test_pipe_convenience_write_long2", "test_pipe_convenience_read_long2", "test_pipe_convenience_write_long4", "test_pipe_convenience_read_long4", "test_pipe_convenience_write_long8", "test_pipe_convenience_read_long8", "test_pipe_convenience_write_long16", "test_pipe_convenience_read_long16" };
static const char* convenience_ulong_kernel_name[] = { "test_pipe_convenience_write_ulong", "test_pipe_convenience_read_ulong", "test_pipe_convenience_write_ulong2", "test_pipe_convenience_read_ulong2", "test_pipe_convenience_write_ulong4", "test_pipe_convenience_read_ulong4", "test_pipe_convenience_write_ulong8", "test_pipe_convenience_read_ulong8", "test_pipe_convenience_write_ulong16", "test_pipe_convenience_read_ulong16" };
static const char* convenience_char_kernel_name[] = { "test_pipe_convenience_write_char", "test_pipe_convenience_read_char", "test_pipe_convenience_write_char2", "test_pipe_convenience_read_char2", "test_pipe_convenience_write_char4", "test_pipe_convenience_read_char4", "test_pipe_convenience_write_char8", "test_pipe_convenience_read_char8", "test_pipe_convenience_write_char16", "test_pipe_convenience_read_char16" };
static const char* convenience_uchar_kernel_name[] = { "test_pipe_convenience_write_uchar", "test_pipe_convenience_read_uchar", "test_pipe_convenience_write_uchar2", "test_pipe_convenience_read_uchar2", "test_pipe_convenience_write_uchar4", "test_pipe_convenience_read_uchar4", "test_pipe_convenience_write_uchar8", "test_pipe_convenience_read_uchar8", "test_pipe_convenience_write_uchar16", "test_pipe_convenience_read_uchar16" };
static const char* convenience_short_kernel_name[] = { "test_pipe_convenience_write_short", "test_pipe_convenience_read_short", "test_pipe_convenience_write_short2", "test_pipe_convenience_read_short2", "test_pipe_convenience_write_short4", "test_pipe_convenience_read_short4", "test_pipe_convenience_write_short8", "test_pipe_convenience_read_short8", "test_pipe_convenience_write_short16", "test_pipe_convenience_read_short16" };
static const char* convenience_ushort_kernel_name[] = { "test_pipe_convenience_write_ushort", "test_pipe_convenience_read_ushort", "test_pipe_convenience_write_ushort2", "test_pipe_convenience_read_ushort2", "test_pipe_convenience_write_ushort4", "test_pipe_convenience_read_ushort4", "test_pipe_convenience_write_ushort8", "test_pipe_convenience_read_ushort8", "test_pipe_convenience_write_ushort16", "test_pipe_convenience_read_ushort16" };
static const char* convenience_float_kernel_name[] = { "test_pipe_convenience_write_float", "test_pipe_convenience_read_float", "test_pipe_convenience_write_float2", "test_pipe_convenience_read_float2", "test_pipe_convenience_write_float4", "test_pipe_convenience_read_float4", "test_pipe_convenience_write_float8", "test_pipe_convenience_read_float8", "test_pipe_convenience_write_float16", "test_pipe_convenience_read_float16" };
static const char* convenience_half_kernel_name[] = { "test_pipe_convenience_write_half", "test_pipe_convenience_read_half", "test_pipe_convenience_write_half2", "test_pipe_convenience_read_half2", "test_pipe_convenience_write_half4", "test_pipe_convenience_read_half4", "test_pipe_convenience_write_half8", "test_pipe_convenience_read_half8", "test_pipe_convenience_write_half16", "test_pipe_convenience_read_half16" };
static const char* convenience_double_kernel_name[] = { "test_pipe_convenience_write_double", "test_pipe_convenience_read_double", "test_pipe_convenience_write_double2", "test_pipe_convenience_read_double2", "test_pipe_convenience_write_double4", "test_pipe_convenience_read_double4", "test_pipe_convenience_write_double8", "test_pipe_convenience_read_double8", "test_pipe_convenience_write_double16", "test_pipe_convenience_read_double16" };
static void insertPragmaForHalfType(std::stringstream &stream, char *type)
{
if (strncmp(type, "half", 4) == 0)
{
stream << "#pragma OPENCL EXTENSION cl_khr_fp16 : enable\n";
}
}
void createKernelSource(std::stringstream &stream, char *type)
{
insertPragmaForHalfType(stream, type);
// clang-format off
stream << R"(
__kernel void test_pipe_write_)" << type << "(__global " << type << " *src, __write_only pipe " << type << R"( out_pipe)
{
int gid = get_global_id(0);
reserve_id_t res_id;
res_id = reserve_write_pipe(out_pipe, 1);
if(is_valid_reserve_id(res_id))
{
write_pipe(out_pipe, res_id, 0, &src[gid]);
commit_write_pipe(out_pipe, res_id);
}
}
__kernel void test_pipe_read_)" << type << "(__read_only pipe " << type << " in_pipe, __global " << type << R"( *dst)
{
int gid = get_global_id(0);
reserve_id_t res_id;
res_id = reserve_read_pipe(in_pipe, 1);
if(is_valid_reserve_id(res_id))
{
read_pipe(in_pipe, res_id, 0, &dst[gid]);
commit_read_pipe(in_pipe, res_id);
}
}
)";
// clang-format on
}
void createKernelSourceWorkGroup(std::stringstream &stream, char *type)
{
insertPragmaForHalfType(stream, type);
// clang-format off
stream << R"(
__kernel void test_pipe_workgroup_write_)" << type << "(__global " << type << " *src, __write_only pipe " << type << R"( out_pipe)
{
int gid = get_global_id(0);
__local reserve_id_t res_id;
res_id = work_group_reserve_write_pipe(out_pipe, get_local_size(0));
if(is_valid_reserve_id(res_id))
{
write_pipe(out_pipe, res_id, get_local_id(0), &src[gid]);
work_group_commit_write_pipe(out_pipe, res_id);
}
}
__kernel void test_pipe_workgroup_read_)" << type << "(__read_only pipe " << type << " in_pipe, __global " << type << R"( *dst)
{
int gid = get_global_id(0);
__local reserve_id_t res_id;
res_id = work_group_reserve_read_pipe(in_pipe, get_local_size(0));
if(is_valid_reserve_id(res_id))
{
read_pipe(in_pipe, res_id, get_local_id(0), &dst[gid]);
work_group_commit_read_pipe(in_pipe, res_id);
}
}
)";
// clang-format on
}
void createKernelSourceSubGroup(std::stringstream &stream, char *type)
{
insertPragmaForHalfType(stream, type);
// clang-format off
stream << R"(
#pragma OPENCL EXTENSION cl_khr_subgroups : enable
__kernel void test_pipe_subgroup_write_)" << type << "(__global " << type << " *src, __write_only pipe " << type << R"( out_pipe)
{
int gid = get_global_id(0);
reserve_id_t res_id;
res_id = sub_group_reserve_write_pipe(out_pipe, get_sub_group_size());
if(is_valid_reserve_id(res_id))
{
write_pipe(out_pipe, res_id, get_sub_group_local_id(), &src[gid]);
sub_group_commit_write_pipe(out_pipe, res_id);
}
}
__kernel void test_pipe_subgroup_read_)" << type << "(__read_only pipe " << type << " in_pipe, __global " << type << R"( *dst)
{
int gid = get_global_id(0);
reserve_id_t res_id;
res_id = sub_group_reserve_read_pipe(in_pipe, get_sub_group_size());
if(is_valid_reserve_id(res_id))
{
read_pipe(in_pipe, res_id, get_sub_group_local_id(), &dst[gid]);
sub_group_commit_read_pipe(in_pipe, res_id);
}
}
)";
// clang-format on
}
void createKernelSourceConvenience(std::stringstream &stream, char *type)
{
insertPragmaForHalfType(stream, type);
// clang-format off
stream << R"(
__kernel void test_pipe_convenience_write_)" << type << "(__global " << type << " *src, __write_only pipe " << type << R"( out_pipe)
{
int gid = get_global_id(0);
write_pipe(out_pipe, &src[gid]);
}
__kernel void test_pipe_convenience_read_)" << type << "(__read_only pipe " << type << " in_pipe, __global " << type << R"( *dst)
{
int gid = get_global_id(0);
read_pipe(in_pipe, &dst[gid]);
}
)";
// clang-format on
}
// verify functions
static int verify_readwrite_int(void *ptr1, void *ptr2, int n)
{
int i;
int sum_input = 0, sum_output = 0;
cl_int *inptr = (cl_int *)ptr1;
cl_int *outptr = (cl_int *)ptr2;
for(i = 0; i < n; i++)
{
sum_input += inptr[i];
sum_output += outptr[i];
}
if(sum_input != sum_output){
return -1;
}
return 0;
}
static int verify_readwrite_uint(void *ptr1, void *ptr2, int n)
{
int i;
int sum_input = 0, sum_output = 0;
cl_uint *inptr = (cl_uint *)ptr1;
cl_uint *outptr = (cl_uint *)ptr2;
for(i = 0; i < n; i++)
{
sum_input += inptr[i];
sum_output += outptr[i];
}
if(sum_input != sum_output){
return -1;
}
return 0;
}
static int verify_readwrite_short(void *ptr1, void *ptr2, int n)
{
int i;
int sum_input = 0, sum_output = 0;
cl_short *inptr = (cl_short *)ptr1;
cl_short *outptr = (cl_short *)ptr2;
for(i = 0; i < n; i++)
{
sum_input += inptr[i];
sum_output += outptr[i];
}
if(sum_input != sum_output){
return -1;
}
return 0;
}
static int verify_readwrite_ushort(void *ptr1, void *ptr2, int n)
{
int i;
int sum_input = 0, sum_output = 0;
cl_ushort *inptr = (cl_ushort *)ptr1;
cl_ushort *outptr = (cl_ushort *)ptr2;
for(i = 0; i < n; i++)
{
sum_input += inptr[i];
sum_output += outptr[i];
}
if(sum_input != sum_output){
return -1;
}
return 0;
}
static int verify_readwrite_char(void *ptr1, void *ptr2, int n)
{
int i;
int sum_input = 0, sum_output = 0;
cl_char *inptr = (cl_char *)ptr1;
cl_char *outptr = (cl_char *)ptr2;
for(i = 0; i < n; i++)
{
sum_input += inptr[i];
sum_output += outptr[i];
}
if(sum_input != sum_output){
return -1;
}
return 0;
}
static int verify_readwrite_uchar(void *ptr1, void *ptr2, int n)
{
int i;
int sum_input = 0, sum_output = 0;
cl_uchar *inptr = (cl_uchar *)ptr1;
cl_uchar *outptr = (cl_uchar *)ptr2;
for(i = 0; i < n; i++)
{
sum_input += inptr[i];
sum_output += outptr[i];
}
if(sum_input != sum_output){
return -1;
}
return 0;
}
static int verify_readwrite_float(void *ptr1, void *ptr2, int n)
{
int i;
int sum_input = 0, sum_output = 0;
int *inptr = (int *)ptr1;
int *outptr = (int *)ptr2;
for(i = 0; i < n; i++)
{
sum_input += inptr[i];
sum_output += outptr[i];
}
if(sum_input != sum_output){
return -1;
}
return 0;
}
static int verify_readwrite_half(void *ptr1, void *ptr2, int n)
{
int i;
int sum_input = 0, sum_output = 0;
cl_ushort *inptr = (cl_ushort *)ptr1;
cl_ushort *outptr = (cl_ushort *)ptr2;
for(i = 0; i < n; i++)
{
sum_input += inptr[i];
sum_output += outptr[i];
}
if(sum_input != sum_output){
return -1;
}
return 0;
}
static int verify_readwrite_long(void *ptr1, void *ptr2, int n)
{
int i;
cl_long sum_input = 0, sum_output = 0;
cl_long *inptr = (cl_long *)ptr1;
cl_long *outptr = (cl_long *)ptr2;
for(i = 0; i < n; i++)
{
sum_input += inptr[i];
sum_output += outptr[i];
}
if(sum_input != sum_output){
return -1;
}
return 0;
}
static int verify_readwrite_ulong(void *ptr1, void *ptr2, int n)
{
int i;
cl_ulong sum_input = 0, sum_output = 0;
cl_ulong *inptr = (cl_ulong *)ptr1;
cl_ulong *outptr = (cl_ulong *)ptr2;
for(i = 0; i < n; i++)
{
sum_input += inptr[i];
sum_output += outptr[i];
}
if(sum_input != sum_output){
return -1;
}
return 0;
}
static int verify_readwrite_double(void *ptr1, void *ptr2, int n)
{
int i;
long long int sum_input = 0, sum_output = 0;
long long int *inptr = (long long int *)ptr1;
long long int *outptr = (long long int *)ptr2;
for(i = 0; i < n; i++)
{
sum_input += inptr[i];
sum_output += outptr[i];
}
if(sum_input != sum_output){
return -1;
}
return 0;
}
static int verify_readwrite_struct(void *ptr1, void *ptr2, int n)
{
int i;
int sum_input_char = 0, sum_output_char = 0;
int sum_input_int = 0, sum_output_int = 0;
TestStruct *inptr = (TestStruct *)ptr1;
TestStruct *outptr = (TestStruct *)ptr2;
for(i = 0; i < n; i++)
{
sum_input_char += inptr[i].a;
sum_input_int += inptr[i].b;
sum_output_char += outptr[i].a;
sum_output_int += outptr[i].b;
}
if( (sum_input_char != sum_output_char) && (sum_input_int != sum_output_int) ){
return -1;
}
return 0;
}
int test_pipe_readwrite( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements, size_t size, char *type, int loops,
void *inptr[5], const char *kernelName[], int (*fn)(void *, void *, int) )
{
clMemWrapper pipes[5];
clMemWrapper buffers[10];
void *outptr[5];
BufferOwningPtr<cl_int> BufferOutPtr[5];
clProgramWrapper program[5];
clKernelWrapper kernel[10];
size_t global_work_size[3];
size_t local_work_size[3];
cl_int err;
int i, ii;
size_t ptrSizes[5];
int total_errors = 0;
clEventWrapper producer_sync_event[5];
clEventWrapper consumer_sync_event[5];
std::stringstream sourceCode[5];
char vector_type[10];
size_t min_alignment = get_min_alignment(context);
global_work_size[0] = (cl_uint)num_elements;
ptrSizes[0] = size;
ptrSizes[1] = ptrSizes[0] << 1;
ptrSizes[2] = ptrSizes[1] << 1;
ptrSizes[3] = ptrSizes[2] << 1;
ptrSizes[4] = ptrSizes[3] << 1;
for (i = 0; i < loops; i++)
{
ii = i << 1;
buffers[ii] =
clCreateBuffer(context, CL_MEM_COPY_HOST_PTR,
ptrSizes[i] * num_elements, inptr[i], &err);
test_error_ret(err, " clCreateBuffer failed", -1);
outptr[i] = align_malloc(ptrSizes[i] * num_elements, min_alignment);
BufferOutPtr[i].reset(outptr[i], nullptr, 0, size, true);
buffers[ii + 1] =
clCreateBuffer(context, CL_MEM_USE_HOST_PTR,
ptrSizes[i] * num_elements, outptr[i], &err);
test_error_ret(err, " clCreateBuffer failed", -1);
// Creating pipe with non-power of 2 size
pipes[i] = clCreatePipe(context, CL_MEM_HOST_NO_ACCESS, ptrSizes[i],
num_elements + 3, NULL, &err);
test_error_ret(err, " clCreatePipe failed", -1);
switch (i)
{
case 0: sprintf(vector_type, "%s", type); break;
case 1: sprintf(vector_type, "%s%d", type, 2); break;
case 2: sprintf(vector_type, "%s%d", type, 4); break;
case 3: sprintf(vector_type, "%s%d", type, 8); break;
case 4: sprintf(vector_type, "%s%d", type, 16); break;
}
if (useWorkgroupReserve == 1)
{
createKernelSourceWorkGroup(sourceCode[i], vector_type);
}
else if (useSubgroupReserve == 1)
{
createKernelSourceSubGroup(sourceCode[i], vector_type);
}
else if (useConvenienceBuiltIn == 1)
{
createKernelSourceConvenience(sourceCode[i], vector_type);
}
else
{
createKernelSource(sourceCode[i], vector_type);
}
std::string kernel_source = sourceCode[i].str();
const char *sources[] = { kernel_source.c_str() };
// Create producer kernel
err = create_single_kernel_helper_with_build_options(
context, &program[i], &kernel[ii], 1, sources, kernelName[ii],
"-cl-std=CL2.0");
test_error_ret(err, " Error creating program", -1);
// Create consumer kernel
kernel[ii + 1] = clCreateKernel(program[i], kernelName[ii + 1], &err);
test_error_ret(err, " Error creating kernel", -1);
err =
clSetKernelArg(kernel[ii], 0, sizeof(cl_mem), (void *)&buffers[ii]);
err |= clSetKernelArg(kernel[ii], 1, sizeof(cl_mem), (void *)&pipes[i]);
err |= clSetKernelArg(kernel[ii + 1], 0, sizeof(cl_mem),
(void *)&pipes[i]);
err |= clSetKernelArg(kernel[ii + 1], 1, sizeof(cl_mem),
(void *)&buffers[ii + 1]);
test_error_ret(err, " clSetKernelArg failed", -1);
if (useWorkgroupReserve == 1 || useSubgroupReserve == 1)
{
err = get_max_common_work_group_size(
context, kernel[ii], global_work_size[0], &local_work_size[0]);
test_error(err, "Unable to get work group size to use");
// Launch Producer kernel
err = clEnqueueNDRangeKernel(queue, kernel[ii], 1, NULL,
global_work_size, local_work_size, 0,
NULL, &producer_sync_event[i]);
test_error_ret(err, " clEnqueueNDRangeKernel failed", -1);
}
else
{
// Launch Producer kernel
err = clEnqueueNDRangeKernel(queue, kernel[ii], 1, NULL,
global_work_size, NULL, 0, NULL,
&producer_sync_event[i]);
test_error_ret(err, " clEnqueueNDRangeKernel failed", -1);
}
if (useWorkgroupReserve == 1 || useSubgroupReserve == 1)
{
err = get_max_common_work_group_size(context, kernel[ii + 1],
global_work_size[0],
&local_work_size[0]);
test_error(err, "Unable to get work group size to use");
// Launch Consumer kernel
err = clEnqueueNDRangeKernel(queue, kernel[ii + 1], 1, NULL,
global_work_size, local_work_size, 1,
&producer_sync_event[i],
&consumer_sync_event[i]);
test_error_ret(err, " clEnqueueNDRangeKernel failed", -1);
}
else
{
// Launch Consumer kernel
err = clEnqueueNDRangeKernel(
queue, kernel[ii + 1], 1, NULL, global_work_size, NULL, 1,
&producer_sync_event[i], &consumer_sync_event[i]);
test_error_ret(err, " clEnqueueNDRangeKernel failed", -1);
}
err = clEnqueueReadBuffer(queue, buffers[ii + 1], true, 0,
ptrSizes[i] * num_elements, outptr[i], 1,
&consumer_sync_event[i], NULL);
test_error_ret(err, " clEnqueueReadBuffer failed", -1);
if (fn(inptr[i], outptr[i],
(int)(ptrSizes[i] * (size_t)num_elements / ptrSizes[0])))
{
log_error("%s%d test failed\n", type, 1 << i);
total_errors++;
}
else
{
log_info("%s%d test passed\n", type, 1 << i);
}
}
return total_errors;
}
int test_pipe_readwrite_struct_generic( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements,
const char *kernelCode, const char *kernelName[])
{
clMemWrapper buffers[2];
clMemWrapper pipe;
void *outptr;
TestStruct *inptr;
BufferOwningPtr<cl_int> BufferInPtr;
BufferOwningPtr<TestStruct> BufferOutPtr;
clProgramWrapper program;
clKernelWrapper kernel[2];
size_t size = sizeof(TestStruct);
size_t global_work_size[3];
cl_int err;
int total_errors = 0;
int i;
MTdataHolder d(gRandomSeed);
clEventWrapper producer_sync_event = NULL;
clEventWrapper consumer_sync_event = NULL;
size_t min_alignment = get_min_alignment(context);
global_work_size[0] = (size_t)num_elements;
inptr = (TestStruct *)align_malloc(size * num_elements, min_alignment);
for (i = 0; i < num_elements; i++)
{
inptr[i].a = (char)genrand_int32(d);
inptr[i].b = genrand_int32(d);
}
BufferInPtr.reset(inptr, nullptr, 0, size, true);
buffers[0] = clCreateBuffer(context, CL_MEM_COPY_HOST_PTR, size * num_elements, inptr, &err);
test_error_ret(err, " clCreateBuffer failed", -1);
outptr = align_malloc( size * num_elements, min_alignment);
BufferOutPtr.reset(outptr, nullptr, 0, size, true);
buffers[1] = clCreateBuffer(context, CL_MEM_USE_HOST_PTR, size * num_elements, outptr, &err);
test_error_ret(err, " clCreateBuffer failed", -1);
pipe = clCreatePipe(context, CL_MEM_HOST_NO_ACCESS, size, num_elements, NULL, &err);
test_error_ret(err, " clCreatePipe failed", -1);
// Create producer kernel
err = create_single_kernel_helper_with_build_options(context, &program, &kernel[0], 1, &kernelCode, kernelName[0], "-cl-std=CL2.0");
test_error_ret(err, " Error creating program", -1);
//Create consumer kernel
kernel[1] = clCreateKernel(program, kernelName[1], &err);
test_error_ret(err, " Error creating kernel", -1);
err = clSetKernelArg(kernel[0], 0, sizeof(cl_mem), (void*)&buffers[0]);
err |= clSetKernelArg(kernel[0], 1, sizeof(cl_mem), (void*)&pipe);
err |= clSetKernelArg(kernel[1], 0, sizeof(cl_mem), (void*)&pipe);
err |= clSetKernelArg(kernel[1], 1, sizeof(cl_mem), (void*)&buffers[1]);
test_error_ret(err, " clSetKernelArg failed", -1);
// Launch Producer kernel
err = clEnqueueNDRangeKernel( queue, kernel[0], 1, NULL, global_work_size, NULL, 0, NULL, &producer_sync_event );
test_error_ret(err, " clEnqueueNDRangeKernel failed", -1);
// Launch Consumer kernel
err = clEnqueueNDRangeKernel( queue, kernel[1], 1, NULL, global_work_size, NULL, 1, &producer_sync_event, &consumer_sync_event );
test_error_ret(err, " clEnqueueNDRangeKernel failed", -1);
err = clEnqueueReadBuffer(queue, buffers[1], true, 0, size*num_elements, outptr, 1, &consumer_sync_event, NULL);
test_error_ret(err, " clEnqueueReadBuffer failed", -1);
if( verify_readwrite_struct( inptr, outptr, num_elements)){
log_error("struct_readwrite test failed\n");
return -1;
}
else {
log_info("struct_readwrite test passed\n");
}
return 0;
}
int test_pipe_readwrite_int( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
cl_int *inptr[5];
size_t ptrSizes[5];
int i, err;
cl_uint j;
int (*foo)(void *,void *,int);
MTdata d = init_genrand( gRandomSeed );
size_t min_alignment = get_min_alignment(context);
foo = verify_readwrite_int;
ptrSizes[0] = sizeof(cl_int);
ptrSizes[1] = ptrSizes[0] << 1;
ptrSizes[2] = ptrSizes[1] << 1;
ptrSizes[3] = ptrSizes[2] << 1;
ptrSizes[4] = ptrSizes[3] << 1;
for ( i = 0; i < 5; i++ ){
inptr[i] = (cl_int *)align_malloc(ptrSizes[i] * num_elements, min_alignment);
for ( j = 0; j < ptrSizes[i] * num_elements / ptrSizes[0]; j++ )
inptr[i][j] = (int)genrand_int32(d);
}
if(useWorkgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_int ), (char*)"int", 5, (void**)inptr,
workgroup_int_kernel_name, foo);
}
else if(useSubgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_int ), (char*)"int", 5, (void**)inptr,
subgroup_int_kernel_name, foo);
}
else if(useConvenienceBuiltIn == 1) {
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_int ), (char*)"int", 5, (void**)inptr,
convenience_int_kernel_name, foo);
}
else {
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_int ), (char*)"int", 5, (void**)inptr,
int_kernel_name, foo);
}
for ( i = 0; i < 5; i++ ){
align_free( (void *)inptr[i] );
}
free_mtdata(d);
return err;
}
int test_pipe_readwrite_uint( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
cl_uint *inptr[5];
size_t ptrSizes[5];
int i, err;
cl_uint j;
int (*foo)(void *,void *,int);
MTdata d = init_genrand( gRandomSeed );
size_t min_alignment = get_min_alignment(context);
foo = verify_readwrite_uint;
ptrSizes[0] = sizeof(cl_uint);
ptrSizes[1] = ptrSizes[0] << 1;
ptrSizes[2] = ptrSizes[1] << 1;
ptrSizes[3] = ptrSizes[2] << 1;
ptrSizes[4] = ptrSizes[3] << 1;
for ( i = 0; i < 5; i++ ){
inptr[i] = (cl_uint *)align_malloc(ptrSizes[i] * num_elements, min_alignment);
for ( j = 0; j < ptrSizes[i] * num_elements / ptrSizes[0]; j++ )
inptr[i][j] = (cl_uint)genrand_int32(d);
}
if(useWorkgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_uint ), (char*)"uint", 5, (void**)inptr,
workgroup_uint_kernel_name, foo);
}
else if(useSubgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_uint ), (char*)"uint", 5, (void**)inptr,
subgroup_uint_kernel_name, foo);
}
else if(useConvenienceBuiltIn == 1) {
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_uint ), (char*)"uint", 5, (void**)inptr,
convenience_uint_kernel_name, foo);
}
else {
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_uint ), (char*)"uint", 5, (void**)inptr,
uint_kernel_name, foo);
}
for ( i = 0; i < 5; i++ ){
align_free( (void *)inptr[i] );
}
free_mtdata(d);
return err;
}
int test_pipe_readwrite_short( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
cl_short *inptr[5];
size_t ptrSizes[5];
int i, err;
cl_uint j;
int (*foo)(void *,void *,int);
MTdata d = init_genrand( gRandomSeed );
size_t min_alignment = get_min_alignment(context);
foo = verify_readwrite_short;
ptrSizes[0] = sizeof(cl_short);
ptrSizes[1] = ptrSizes[0] << 1;
ptrSizes[2] = ptrSizes[1] << 1;
ptrSizes[3] = ptrSizes[2] << 1;
ptrSizes[4] = ptrSizes[3] << 1;
for ( i = 0; i < 5; i++ ){
inptr[i] = (cl_short *)align_malloc(ptrSizes[i] * num_elements, min_alignment);
for ( j = 0; j < ptrSizes[i] * num_elements / ptrSizes[0]; j++ )
inptr[i][j] = (cl_short)genrand_int32(d);
}
if(useWorkgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_short ), (char*)"short", 5, (void**)inptr,
workgroup_short_kernel_name, foo);
}
else if(useSubgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_short ), (char*)"short", 5, (void**)inptr,
subgroup_short_kernel_name, foo);
}
else if(useConvenienceBuiltIn == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_short ), (char*)"short", 5, (void**)inptr,
convenience_short_kernel_name, foo);
}
else{
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_short ), (char*)"short", 5, (void**)inptr,
short_kernel_name, foo);
}
for ( i = 0; i < 5; i++ ){
align_free( (void *)inptr[i] );
}
free_mtdata(d);
return err;
}
int test_pipe_readwrite_ushort( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
cl_ushort *inptr[5];
size_t ptrSizes[5];
int i, err;
cl_uint j;
int (*foo)(void *,void *,int);
MTdata d = init_genrand( gRandomSeed );
size_t min_alignment = get_min_alignment(context);
foo = verify_readwrite_ushort;
ptrSizes[0] = sizeof(cl_ushort);
ptrSizes[1] = ptrSizes[0] << 1;
ptrSizes[2] = ptrSizes[1] << 1;
ptrSizes[3] = ptrSizes[2] << 1;
ptrSizes[4] = ptrSizes[3] << 1;
for ( i = 0; i < 5; i++ ){
inptr[i] = (cl_ushort *)align_malloc(ptrSizes[i] * num_elements, min_alignment);
for ( j = 0; j < ptrSizes[i] * num_elements / ptrSizes[0]; j++ )
inptr[i][j] = (cl_ushort)genrand_int32(d);
}
if(useWorkgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_ushort ), (char*)"ushort", 5, (void**)inptr,
workgroup_ushort_kernel_name, foo);
}
else if(useSubgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_ushort ), (char*)"ushort", 5, (void**)inptr,
subgroup_ushort_kernel_name, foo);
}
else if(useConvenienceBuiltIn == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_ushort ), (char*)"ushort", 5, (void**)inptr,
convenience_ushort_kernel_name, foo);
}
else{
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_ushort ), (char*)"ushort", 5, (void**)inptr,
ushort_kernel_name, foo);
}
for ( i = 0; i < 5; i++ ){
align_free( (void *)inptr[i] );
}
free_mtdata(d);
return err;
}
int test_pipe_readwrite_char( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
cl_char *inptr[5];
size_t ptrSizes[5];
int i, err;
cl_uint j;
int (*foo)(void *,void *,int);
MTdata d = init_genrand( gRandomSeed );
size_t min_alignment = get_min_alignment(context);
foo = verify_readwrite_char;
ptrSizes[0] = sizeof(cl_char);
ptrSizes[1] = ptrSizes[0] << 1;
ptrSizes[2] = ptrSizes[1] << 1;
ptrSizes[3] = ptrSizes[2] << 1;
ptrSizes[4] = ptrSizes[3] << 1;
for ( i = 0; i < 5; i++ ){
inptr[i] = (cl_char *)align_malloc(ptrSizes[i] * num_elements, min_alignment);
for ( j = 0; j < ptrSizes[i] * num_elements / ptrSizes[0]; j++ )
inptr[i][j] = (char)genrand_int32(d);
}
if(useWorkgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_char ), (char*)"char", 5, (void**)inptr,
workgroup_char_kernel_name, foo);
}
else if(useSubgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_char ), (char*)"char", 5, (void**)inptr,
subgroup_char_kernel_name, foo);
}
else if(useConvenienceBuiltIn == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_char ), (char*)"char", 5, (void**)inptr,
convenience_char_kernel_name, foo);
}
else{
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_char ), (char*)"char", 5, (void**)inptr,
char_kernel_name, foo);
}
for ( i = 0; i < 5; i++ ){
align_free( (void *)inptr[i] );
}
free_mtdata(d);
return err;
}
int test_pipe_readwrite_uchar( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
cl_uchar *inptr[5];
size_t ptrSizes[5];
int i, err;
cl_uint j;
int (*foo)(void *,void *,int);
MTdata d = init_genrand( gRandomSeed );
size_t min_alignment = get_min_alignment(context);
foo = verify_readwrite_uchar;
ptrSizes[0] = sizeof(cl_uchar);
ptrSizes[1] = ptrSizes[0] << 1;
ptrSizes[2] = ptrSizes[1] << 1;
ptrSizes[3] = ptrSizes[2] << 1;
ptrSizes[4] = ptrSizes[3] << 1;
for ( i = 0; i < 5; i++ ){
inptr[i] = (cl_uchar *)align_malloc(ptrSizes[i] * num_elements, min_alignment);
for ( j = 0; j < ptrSizes[i] * num_elements / ptrSizes[0]; j++ )
inptr[i][j] = (uchar)genrand_int32(d);
}
if(useWorkgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_uchar ), (char*)"uchar", 5, (void**)inptr,
workgroup_uchar_kernel_name, foo);
}
else if(useSubgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_uchar ), (char*)"uchar", 5, (void**)inptr,
subgroup_uchar_kernel_name, foo);
}
else if(useConvenienceBuiltIn == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_uchar ), (char*)"uchar", 5, (void**)inptr,
convenience_uchar_kernel_name, foo);
}
else{
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_uchar ), (char*)"uchar", 5, (void**)inptr,
uchar_kernel_name, foo);
}
for ( i = 0; i < 5; i++ ){
align_free( (void *)inptr[i] );
}
free_mtdata(d);
return err;
}
int test_pipe_readwrite_float( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
float *inptr[5];
size_t ptrSizes[5];
int i, err;
cl_uint j;
int (*foo)(void *,void *,int);
MTdata d = init_genrand( gRandomSeed );
size_t min_alignment = get_min_alignment(context);
foo = verify_readwrite_float;
ptrSizes[0] = sizeof(cl_float);
ptrSizes[1] = ptrSizes[0] << 1;
ptrSizes[2] = ptrSizes[1] << 1;
ptrSizes[3] = ptrSizes[2] << 1;
ptrSizes[4] = ptrSizes[3] << 1;
for ( i = 0; i < 5; i++ ){
inptr[i] = (float *)align_malloc(ptrSizes[i] * num_elements, min_alignment);
for ( j = 0; j < ptrSizes[i] * num_elements / ptrSizes[0]; j++ )
inptr[i][j] = get_random_float( -32, 32, d );
}
if(useWorkgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_float ), (char*)"float", 5, (void**)inptr,
workgroup_float_kernel_name, foo);
}
else if(useSubgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_float ), (char*)"float", 5, (void**)inptr,
subgroup_float_kernel_name, foo);
}
else if(useConvenienceBuiltIn == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_float ), (char*)"float", 5, (void**)inptr,
convenience_float_kernel_name, foo);
}
else{
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_float ), (char*)"float", 5, (void**)inptr,
float_kernel_name, foo);
}
for ( i = 0; i < 5; i++ ){
align_free( (void *)inptr[i] );
}
free_mtdata(d);
return err;
}
int test_pipe_readwrite_half( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
float *inptr[5];
size_t ptrSizes[5];
int i, err;
cl_uint j;
int (*foo)(void *,void *,int);
MTdata d = init_genrand( gRandomSeed );
size_t min_alignment = get_min_alignment(context);
foo = verify_readwrite_half;
if(!is_extension_available(deviceID, "cl_khr_fp16"))
{
log_info("cl_khr_fp16 is not supported on this platoform. Skipping test.\n");
return CL_SUCCESS;
}
ptrSizes[0] = sizeof(cl_float) / 2;
ptrSizes[1] = ptrSizes[0] << 1;
ptrSizes[2] = ptrSizes[1] << 1;
ptrSizes[3] = ptrSizes[2] << 1;
ptrSizes[4] = ptrSizes[3] << 1;
for ( i = 0; i < 5; i++ ){
inptr[i] = (float *)align_malloc(ptrSizes[i] * num_elements, min_alignment);
for ( j = 0; j < ptrSizes[i] * num_elements / (ptrSizes[0] * 2); j++ )
inptr[i][j] = get_random_float( -32, 32, d );
}
if(useWorkgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_half ), (char*)"half", 5, (void**)inptr,
workgroup_half_kernel_name, foo);
}
else if(useSubgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_half ), (char*)"half", 5, (void**)inptr,
subgroup_half_kernel_name, foo);
}
else if(useConvenienceBuiltIn == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_half ), (char*)"half", 5, (void**)inptr,
convenience_half_kernel_name, foo);
}
else{
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_half ), (char*)"half", 5, (void**)inptr,
half_kernel_name, foo);
}
for ( i = 0; i < 5; i++ ){
align_free( (void *)inptr[i] );
}
free_mtdata(d);
return err;
}
int test_pipe_readwrite_long( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
cl_long *inptr[5];
size_t ptrSizes[5];
int i, err;
cl_uint j;
int (*foo)(void *,void *,int);
MTdata d = init_genrand( gRandomSeed );
size_t min_alignment = get_min_alignment(context);
foo = verify_readwrite_long;
ptrSizes[0] = sizeof(cl_long);
ptrSizes[1] = ptrSizes[0] << 1;
ptrSizes[2] = ptrSizes[1] << 1;
ptrSizes[3] = ptrSizes[2] << 1;
ptrSizes[4] = ptrSizes[3] << 1;
//skip devices that don't support long
if (! gHasLong )
{
log_info( "Device does not support 64-bit integers. Skipping test.\n" );
return CL_SUCCESS;
}
for ( i = 0; i < 5; i++ ){
inptr[i] = (cl_long *)align_malloc(ptrSizes[i] * num_elements, min_alignment);
for ( j = 0; j < ptrSizes[i] * num_elements / ptrSizes[0]; j++ )
inptr[i][j] = (cl_long) genrand_int32(d) ^ ((cl_long) genrand_int32(d) << 32);
}
if(useWorkgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_long ), (char*)"long", 5, (void**)inptr,
workgroup_long_kernel_name, foo);
}
else if(useSubgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_long ), (char*)"long", 5, (void**)inptr,
subgroup_long_kernel_name, foo);
}
else if(useConvenienceBuiltIn == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_long ), (char*)"long", 5, (void**)inptr,
convenience_long_kernel_name, foo);
}
else{
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_long ), (char*)"long", 5, (void**)inptr,
long_kernel_name, foo);
}
for ( i = 0; i < 5; i++ ){
align_free( (void *)inptr[i] );
}
free_mtdata(d);
return err;
}
int test_pipe_readwrite_ulong( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
cl_ulong *inptr[5];
size_t ptrSizes[5];
int i, err;
cl_uint j;
int (*foo)(void *,void *,int);
MTdata d = init_genrand( gRandomSeed );
size_t min_alignment = get_min_alignment(context);
foo = verify_readwrite_ulong;
ptrSizes[0] = sizeof(cl_ulong);
ptrSizes[1] = ptrSizes[0] << 1;
ptrSizes[2] = ptrSizes[1] << 1;
ptrSizes[3] = ptrSizes[2] << 1;
ptrSizes[4] = ptrSizes[3] << 1;
//skip devices that don't support long
if (! gHasLong )
{
log_info( "Device does not support 64-bit integers. Skipping test.\n" );
return CL_SUCCESS;
}
for ( i = 0; i < 5; i++ ){
inptr[i] = (cl_ulong *)align_malloc(ptrSizes[i] * num_elements, min_alignment);
for ( j = 0; j < ptrSizes[i] * num_elements / ptrSizes[0]; j++ )
inptr[i][j] = (cl_ulong) genrand_int32(d) | ((cl_ulong) genrand_int32(d) << 32);
}
if(useWorkgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_ulong ), (char*)"ulong", 5, (void**)inptr,
workgroup_ulong_kernel_name, foo);
}
else if(useSubgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_ulong ), (char*)"ulong", 5, (void**)inptr,
subgroup_ulong_kernel_name, foo);
}
else if(useConvenienceBuiltIn == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_ulong ), (char*)"ulong", 5, (void**)inptr,
convenience_ulong_kernel_name, foo);
}
else{
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_ulong ), (char*)"ulong", 5, (void**)inptr,
ulong_kernel_name, foo);
}
for ( i = 0; i < 5; i++ ){
align_free( (void *)inptr[i] );
}
free_mtdata(d);
return err;
}
int test_pipe_readwrite_double( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
cl_double *inptr[5];
size_t ptrSizes[5];
int i, err;
cl_uint j;
int (*foo)(void *,void *,int);
MTdata d = init_genrand( gRandomSeed );
size_t min_alignment = get_min_alignment(context);
foo = verify_readwrite_long;
ptrSizes[0] = sizeof(cl_double);
ptrSizes[1] = ptrSizes[0] << 1;
ptrSizes[2] = ptrSizes[1] << 1;
ptrSizes[3] = ptrSizes[2] << 1;
ptrSizes[4] = ptrSizes[3] << 1;
//skip devices that don't support double
if(!is_extension_available(deviceID, "cl_khr_fp64"))
{
log_info("cl_khr_fp64 is not supported on this platoform. Skipping test.\n");
return CL_SUCCESS;
}
for ( i = 0; i < 5; i++ ){
inptr[i] = (cl_double *)align_malloc(ptrSizes[i] * num_elements, min_alignment);
for ( j = 0; j < ptrSizes[i] * num_elements / ptrSizes[0]; j++ )
inptr[i][j] = get_random_double( -32, 32, d );
}
if(useWorkgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_double ), (char*)"double", 5, (void**)inptr,
workgroup_double_kernel_name, foo);
}
else if(useSubgroupReserve == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_double ), (char*)"double", 5, (void**)inptr,
subgroup_double_kernel_name, foo);
}
else if(useConvenienceBuiltIn == 1){
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_double ), (char*)"double", 5, (void**)inptr,
convenience_double_kernel_name, foo);
}
else{
err = test_pipe_readwrite( deviceID, context, queue, num_elements, sizeof( cl_double ), (char*)"double", 5, (void**)inptr,
double_kernel_name, foo);
}
for ( i = 0; i < 5; i++ ){
align_free( (void *)inptr[i] );
}
free_mtdata(d);
return err;
}
int test_pipe_readwrite_struct( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
const char *kernelNames[] = {"test_pipe_write_struct","test_pipe_read_struct"};
return test_pipe_readwrite_struct_generic(deviceID, context, queue, num_elements, pipe_readwrite_struct_kernel_code, kernelNames);
}
// Work-group functions for pipe reserve/commits
int test_pipe_workgroup_readwrite_int( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useWorkgroupReserve = 1;
useSubgroupReserve = 0;
useConvenienceBuiltIn = 0;
return test_pipe_readwrite_int(deviceID, context, queue, num_elements);
}
int test_pipe_workgroup_readwrite_uint( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useWorkgroupReserve = 1;
useSubgroupReserve = 0;
useConvenienceBuiltIn = 0;
return test_pipe_readwrite_uint(deviceID, context, queue, num_elements);
}
int test_pipe_workgroup_readwrite_short( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useWorkgroupReserve = 1;
useSubgroupReserve = 0;
useConvenienceBuiltIn = 0;
return test_pipe_readwrite_short(deviceID, context, queue, num_elements);
}
int test_pipe_workgroup_readwrite_ushort( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useWorkgroupReserve = 1;
useSubgroupReserve = 0;
useConvenienceBuiltIn = 0;
return test_pipe_readwrite_ushort(deviceID, context, queue, num_elements);
}
int test_pipe_workgroup_readwrite_char( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useWorkgroupReserve = 1;
useSubgroupReserve = 0;
useConvenienceBuiltIn = 0;
return test_pipe_readwrite_char(deviceID, context, queue, num_elements);
}
int test_pipe_workgroup_readwrite_uchar( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useWorkgroupReserve = 1;
useSubgroupReserve = 0;
useConvenienceBuiltIn = 0;
return test_pipe_readwrite_uchar(deviceID, context, queue, num_elements);
}
int test_pipe_workgroup_readwrite_float( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useWorkgroupReserve = 1;
useSubgroupReserve = 0;
useConvenienceBuiltIn = 0;
return test_pipe_readwrite_float(deviceID, context, queue, num_elements);
}
int test_pipe_workgroup_readwrite_half( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useWorkgroupReserve = 1;
useSubgroupReserve = 0;
useConvenienceBuiltIn = 0;
return test_pipe_readwrite_half(deviceID, context, queue, num_elements);
}
int test_pipe_workgroup_readwrite_long( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useWorkgroupReserve = 1;
useSubgroupReserve = 0;
useConvenienceBuiltIn = 0;
return test_pipe_readwrite_long(deviceID, context, queue, num_elements);
}
int test_pipe_workgroup_readwrite_ulong( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useWorkgroupReserve = 1;
useSubgroupReserve = 0;
useConvenienceBuiltIn = 0;
return test_pipe_readwrite_ulong(deviceID, context, queue, num_elements);
}
int test_pipe_workgroup_readwrite_double( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useWorkgroupReserve = 1;
useSubgroupReserve = 0;
useConvenienceBuiltIn = 0;
return test_pipe_readwrite_double(deviceID, context, queue, num_elements);
}
int test_pipe_workgroup_readwrite_struct( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
const char *kernelNames[] = {"test_pipe_workgroup_write_struct","test_pipe_workgroup_read_struct"};
return test_pipe_readwrite_struct_generic(deviceID, context, queue, num_elements, pipe_workgroup_readwrite_struct_kernel_code, kernelNames);
}
// Sub-group functions for pipe reserve/commits
int test_pipe_subgroup_readwrite_int( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useSubgroupReserve = 1;
useWorkgroupReserve = 0;
useConvenienceBuiltIn = 0;
if(!is_extension_available(deviceID, "cl_khr_subgroups"))
{
log_info("cl_khr_subgroups is not supported on this platoform. Skipping test.\n");
return CL_SUCCESS;
}
return test_pipe_readwrite_int(deviceID, context, queue, num_elements);
}
int test_pipe_subgroup_readwrite_uint( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useSubgroupReserve = 1;
useWorkgroupReserve = 0;
useConvenienceBuiltIn = 0;
if(!is_extension_available(deviceID, "cl_khr_subgroups"))
{
log_info("cl_khr_subgroups is not supported on this platoform. Skipping test.\n");
return CL_SUCCESS;
}
return test_pipe_readwrite_uint(deviceID, context, queue, num_elements);
}
int test_pipe_subgroup_readwrite_short( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useSubgroupReserve = 1;
useWorkgroupReserve = 0;
useConvenienceBuiltIn = 0;
if(!is_extension_available(deviceID, "cl_khr_subgroups"))
{
log_info("cl_khr_subgroups is not supported on this platoform. Skipping test.\n");
return CL_SUCCESS;
}
return test_pipe_readwrite_short(deviceID, context, queue, num_elements);
}
int test_pipe_subgroup_readwrite_ushort( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useSubgroupReserve = 1;
useWorkgroupReserve = 0;
useConvenienceBuiltIn = 0;
if(!is_extension_available(deviceID, "cl_khr_subgroups"))
{
log_info("cl_khr_subgroups is not supported on this platoform. Skipping test.\n");
return CL_SUCCESS;
}
return test_pipe_readwrite_ushort(deviceID, context, queue, num_elements);
}
int test_pipe_subgroup_readwrite_char( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useSubgroupReserve = 1;
useWorkgroupReserve = 0;
useConvenienceBuiltIn = 0;
if(!is_extension_available(deviceID, "cl_khr_subgroups"))
{
log_info("cl_khr_subgroups is not supported on this platoform. Skipping test.\n");
return CL_SUCCESS;
}
return test_pipe_readwrite_char(deviceID, context, queue, num_elements);
}
int test_pipe_subgroup_readwrite_uchar( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useSubgroupReserve = 1;
useWorkgroupReserve = 0;
useConvenienceBuiltIn = 0;
if(!is_extension_available(deviceID, "cl_khr_subgroups"))
{
log_info("cl_khr_subgroups is not supported on this platoform. Skipping test.\n");
return CL_SUCCESS;
}
return test_pipe_readwrite_uchar(deviceID, context, queue, num_elements);
}
int test_pipe_subgroup_readwrite_float( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useSubgroupReserve = 1;
useWorkgroupReserve = 0;
useConvenienceBuiltIn = 0;
if(!is_extension_available(deviceID, "cl_khr_subgroups"))
{
log_info("cl_khr_subgroups is not supported on this platoform. Skipping test.\n");
return CL_SUCCESS;
}
return test_pipe_readwrite_float(deviceID, context, queue, num_elements);
}
int test_pipe_subgroup_readwrite_half( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useSubgroupReserve = 1;
useWorkgroupReserve = 0;
useConvenienceBuiltIn = 0;
if(!is_extension_available(deviceID, "cl_khr_subgroups"))
{
log_info("cl_khr_subgroups is not supported on this platoform. Skipping test.\n");
return CL_SUCCESS;
}
return test_pipe_readwrite_half(deviceID, context, queue, num_elements);
}
int test_pipe_subgroup_readwrite_long( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useSubgroupReserve = 1;
useWorkgroupReserve = 0;
useConvenienceBuiltIn = 0;
if(!is_extension_available(deviceID, "cl_khr_subgroups"))
{
log_info("cl_khr_subgroups is not supported on this platoform. Skipping test.\n");
return CL_SUCCESS;
}
return test_pipe_readwrite_long(deviceID, context, queue, num_elements);
}
int test_pipe_subgroup_readwrite_ulong( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useSubgroupReserve = 1;
useWorkgroupReserve = 0;
useConvenienceBuiltIn = 0;
if(!is_extension_available(deviceID, "cl_khr_subgroups"))
{
log_info("cl_khr_subgroups is not supported on this platoform. Skipping test.\n");
return CL_SUCCESS;
}
return test_pipe_readwrite_ulong(deviceID, context, queue, num_elements);
}
int test_pipe_subgroup_readwrite_double( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useSubgroupReserve = 1;
useWorkgroupReserve = 0;
useConvenienceBuiltIn = 0;
if(!is_extension_available(deviceID, "cl_khr_subgroups"))
{
log_info("cl_khr_subgroups is not supported on this platoform. Skipping test.\n");
return CL_SUCCESS;
}
return test_pipe_readwrite_double(deviceID, context, queue, num_elements);
}
int test_pipe_subgroup_readwrite_struct( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
if(!is_extension_available(deviceID, "cl_khr_subgroups"))
{
log_info("cl_khr_subgroups is not supported on this platoform. Skipping test.\n");
return CL_SUCCESS;
}
const char *kernelNames[] = {"test_pipe_subgroup_write_struct","test_pipe_subgroup_read_struct"};
return test_pipe_readwrite_struct_generic(deviceID, context, queue, num_elements, pipe_subgroup_readwrite_struct_kernel_code, kernelNames);
}
// Convenience functions for pipe reserve/commits
int test_pipe_convenience_readwrite_int( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useConvenienceBuiltIn = 1;
useSubgroupReserve = 0;
useWorkgroupReserve = 0;
return test_pipe_readwrite_int(deviceID, context, queue, num_elements);
}
int test_pipe_convenience_readwrite_uint( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useConvenienceBuiltIn = 1;
useSubgroupReserve = 0;
useWorkgroupReserve = 0;
return test_pipe_readwrite_uint(deviceID, context, queue, num_elements);
}
int test_pipe_convenience_readwrite_short( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useConvenienceBuiltIn = 1;
useSubgroupReserve = 0;
useWorkgroupReserve = 0;
return test_pipe_readwrite_short(deviceID, context, queue, num_elements);
}
int test_pipe_convenience_readwrite_ushort( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useConvenienceBuiltIn = 1;
useSubgroupReserve = 0;
useWorkgroupReserve = 0;
return test_pipe_readwrite_ushort(deviceID, context, queue, num_elements);
}
int test_pipe_convenience_readwrite_char( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useConvenienceBuiltIn = 1;
useSubgroupReserve = 0;
useWorkgroupReserve = 0;
return test_pipe_readwrite_char(deviceID, context, queue, num_elements);
}
int test_pipe_convenience_readwrite_uchar( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useConvenienceBuiltIn = 1;
useSubgroupReserve = 0;
useWorkgroupReserve = 0;
return test_pipe_readwrite_uchar(deviceID, context, queue, num_elements);
}
int test_pipe_convenience_readwrite_float( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useConvenienceBuiltIn = 1;
useSubgroupReserve = 0;
useWorkgroupReserve = 0;
return test_pipe_readwrite_float(deviceID, context, queue, num_elements);
}
int test_pipe_convenience_readwrite_half( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useConvenienceBuiltIn = 1;
useSubgroupReserve = 0;
useWorkgroupReserve = 0;
return test_pipe_readwrite_half(deviceID, context, queue, num_elements);
}
int test_pipe_convenience_readwrite_long( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useConvenienceBuiltIn = 1;
useSubgroupReserve = 0;
useWorkgroupReserve = 0;
return test_pipe_readwrite_long(deviceID, context, queue, num_elements);
}
int test_pipe_convenience_readwrite_ulong( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useConvenienceBuiltIn = 1;
useSubgroupReserve = 0;
useWorkgroupReserve = 0;
return test_pipe_readwrite_ulong(deviceID, context, queue, num_elements);
}
int test_pipe_convenience_readwrite_double( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
useConvenienceBuiltIn = 1;
useSubgroupReserve = 0;
useWorkgroupReserve = 0;
return test_pipe_readwrite_double(deviceID, context, queue, num_elements);
}
int test_pipe_convenience_readwrite_struct( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements )
{
const char *kernelNames[] = {"test_pipe_convenience_write_struct","test_pipe_convenience_read_struct"};
return test_pipe_readwrite_struct_generic(deviceID, context, queue, num_elements, pipe_convenience_readwrite_struct_kernel_code, kernelNames);
}