Skip to content

Commit

Permalink
Refactor certain buffer tests to use RAII
Browse files Browse the repository at this point in the history
This change uses RAII to manage object lifetimes to ensure objects'
destruction if an error occurred in the test.
Additionally, modify `test_arrayreadwrite` to pass a custom memory flag
to the test function.

Signed-off-by: Michael Rizkalla <[email protected]>
  • Loading branch information
MichaelRizkalla-arm committed Feb 18, 2025
1 parent b5759ab commit e1b2cfb
Show file tree
Hide file tree
Showing 2 changed files with 206 additions and 146 deletions.
61 changes: 38 additions & 23 deletions test_conformance/basic/test_arrayreadwrite.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,34 +20,44 @@
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <vector>


#include "procs.h"


int
test_arrayreadwrite(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
static int test_arrayreadwrite_impl(cl_device_id device, cl_context context,
cl_command_queue queue, int num_elements,
cl_mem_flags flags)
{
cl_uint *inptr, *outptr;
cl_mem streams[1];
clMemWrapper buffer;
int num_tries = 400;
num_elements = 1024 * 1024 * 4;
int i, j, err;
MTdata d;
MTdataHolder d(gRandomSeed);

inptr = (cl_uint*)malloc(num_elements*sizeof(cl_uint));
outptr = (cl_uint*)malloc(num_elements*sizeof(cl_uint));
std::vector<cl_uint> reference_ptr(num_elements);
std::vector<cl_uint> inptr(num_elements);
std::vector<cl_uint> outptr(num_elements);

// randomize data
d = init_genrand( gRandomSeed );
for (i=0; i<num_elements; i++)
for (int i = 0; i < num_elements; i++)
{
inptr[i] = (cl_uint)(genrand_int32(d) & 0x7FFFFFFF);
reference_ptr[i] = (cl_uint)(genrand_int32(d) & 0x7FFFFFFF);
}

void* host_ptr = nullptr;
if ((flags & CL_MEM_USE_HOST_PTR) || (flags & CL_MEM_COPY_HOST_PTR))
{
host_ptr = inptr.data();
}

streams[0] = clCreateBuffer(context, CL_MEM_READ_WRITE,
sizeof(cl_uint) * num_elements, NULL, &err);
cl_int err = CL_SUCCESS;
buffer = clCreateBuffer(context, flags, sizeof(cl_uint) * num_elements,
host_ptr, &err);
test_error(err, "clCreateBuffer failed");

for (i=0; i<num_tries; i++)
for (int i = 0; i < num_tries; i++)
{
int offset;
int cb;
Expand All @@ -61,15 +71,20 @@ test_arrayreadwrite(cl_device_id device, cl_context context, cl_command_queue qu
if (cb > (num_elements - offset))
cb = num_elements - offset;

err = clEnqueueWriteBuffer(queue, streams[0], CL_TRUE, offset*sizeof(cl_uint), sizeof(cl_uint)*cb,&inptr[offset], 0, NULL, NULL);
err = clEnqueueWriteBuffer(
queue, buffer, CL_TRUE, offset * sizeof(cl_uint),
sizeof(cl_uint) * cb, &reference_ptr[offset], 0, nullptr, nullptr);
test_error(err, "clEnqueueWriteBuffer failed");

err = clEnqueueReadBuffer( queue, streams[0], CL_TRUE, offset*sizeof(cl_uint), cb*sizeof(cl_uint), &outptr[offset], 0, NULL, NULL );
err = clEnqueueReadBuffer(
queue, buffer, CL_TRUE, offset * sizeof(cl_uint),
cb * sizeof(cl_uint), &outptr[offset], 0, nullptr, nullptr);
test_error(err, "clEnqueueReadBuffer failed");

for (j=offset; j<offset+cb; j++)
const cl_uint* expected_buffer_values = reference_ptr.data();
for (int j = offset; j < offset + cb; j++)
{
if (inptr[j] != outptr[j])
if (expected_buffer_values[j] != outptr[j])
{
log_error("ARRAY read, write test failed\n");
err = -1;
Expand All @@ -81,16 +96,16 @@ test_arrayreadwrite(cl_device_id device, cl_context context, cl_command_queue qu
break;
}

free_mtdata(d);
clReleaseMemObject(streams[0]);
free(inptr);
free(outptr);

if (!err)
log_info("ARRAY read, write test passed\n");

return err;
}



int test_arrayreadwrite(cl_device_id device, cl_context context,
cl_command_queue queue, int num_elements)
{
return test_arrayreadwrite_impl(device, context, queue, num_elements,
CL_MEM_READ_WRITE);
}
Loading

0 comments on commit e1b2cfb

Please sign in to comment.