mirror of
https://github.com/KhronosGroup/OpenCL-CTS.git
synced 2026-03-19 06:09:01 +00:00
Reduce number of compilations in buffer suite (#1082)
* Reduce number of compilations in buffer suite Extracts program and kernel compilation from mem_flags loop as they were being recompiled unnecessarily. Fixes #1020 Signed-off-by: Ellen Norris-Thompson <ellen.norris-thompson@arm.com> * Remove misplaced frees in buffer tests Contributes #1020 Signed-off-by: Ellen Norris-Thompson <ellen.norris-thompson@arm.com>
This commit is contained in:
@@ -554,10 +554,10 @@ static int verify_read_struct( void *ptr, int n )
|
||||
static int test_buffer_map_read( cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements, size_t size, char *type, int loops,
|
||||
const char *kernelCode[], const char *kernelName[], int (*fn)(void *,int) )
|
||||
{
|
||||
cl_mem buffers[5];
|
||||
clMemWrapper buffers[5];
|
||||
void *outptr[5];
|
||||
cl_program program[5];
|
||||
cl_kernel kernel[5];
|
||||
clProgramWrapper program[5];
|
||||
clKernelWrapper kernel[5];
|
||||
size_t threads[3], localThreads[3];
|
||||
cl_int err;
|
||||
int i;
|
||||
@@ -580,10 +580,20 @@ static int test_buffer_map_read( cl_device_id deviceID, cl_context context, cl_c
|
||||
if (! gHasLong && strstr(type,"long"))
|
||||
return 0;
|
||||
|
||||
for (src_flag_id=0; src_flag_id < NUM_FLAGS; src_flag_id++) {
|
||||
log_info("Testing with cl_mem_flags src: %s\n", flag_set_names[src_flag_id]);
|
||||
for (i = 0; i < loops; i++)
|
||||
{
|
||||
|
||||
err = create_single_kernel_helper(context, &program[i], &kernel[i], 1,
|
||||
&kernelCode[i], kernelName[i]);
|
||||
if (err)
|
||||
{
|
||||
log_error(" Error creating program for %s\n", type);
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (src_flag_id = 0; src_flag_id < NUM_FLAGS; src_flag_id++)
|
||||
{
|
||||
|
||||
for ( i = 0; i < loops; i++ ){
|
||||
outptr[i] = align_malloc( ptrSizes[i] * num_elements, min_alignment);
|
||||
if ( ! outptr[i] ){
|
||||
log_error( " unable to allocate %d bytes of memory\n", (int)ptrSizes[i] * num_elements );
|
||||
@@ -602,20 +612,9 @@ static int test_buffer_map_read( cl_device_id deviceID, cl_context context, cl_c
|
||||
return -1;
|
||||
}
|
||||
|
||||
err = create_single_kernel_helper(context, &program[i], &kernel[i], 1, &kernelCode[i], kernelName[i] );
|
||||
if ( err ){
|
||||
log_error( " Error creating program for %s\n", type );
|
||||
clReleaseMemObject( buffers[i] );
|
||||
align_free( outptr[i] );
|
||||
return -1;
|
||||
}
|
||||
|
||||
err = clSetKernelArg( kernel[i], 0, sizeof( cl_mem ), (void *)&buffers[i] );
|
||||
if ( err != CL_SUCCESS ){
|
||||
print_error( err, "clSetKernelArg failed\n" );
|
||||
clReleaseKernel( kernel[i] );
|
||||
clReleaseProgram( program[i] );
|
||||
clReleaseMemObject( buffers[i] );
|
||||
align_free( outptr[i] );
|
||||
return -1;
|
||||
}
|
||||
@@ -628,9 +627,6 @@ static int test_buffer_map_read( cl_device_id deviceID, cl_context context, cl_c
|
||||
err = clEnqueueNDRangeKernel( queue, kernel[i], 1, NULL, threads, localThreads, 0, NULL, NULL );
|
||||
if ( err != CL_SUCCESS ){
|
||||
print_error( err, "clEnqueueNDRangeKernel failed\n" );
|
||||
clReleaseKernel( kernel[i] );
|
||||
clReleaseProgram( program[i] );
|
||||
clReleaseMemObject( buffers[i] );
|
||||
align_free( outptr[i] );
|
||||
return -1;
|
||||
}
|
||||
@@ -638,29 +634,23 @@ static int test_buffer_map_read( cl_device_id deviceID, cl_context context, cl_c
|
||||
mappedPtr = clEnqueueMapBuffer(queue, buffers[i], CL_TRUE, CL_MAP_READ, 0, ptrSizes[i]*num_elements, 0, NULL, NULL, &err);
|
||||
if ( err != CL_SUCCESS ){
|
||||
print_error( err, "clEnqueueMapBuffer failed" );
|
||||
clReleaseKernel( kernel[i] );
|
||||
clReleaseProgram( program[i] );
|
||||
clReleaseMemObject( buffers[i] );
|
||||
align_free( outptr[i] );
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (fn(mappedPtr, num_elements*(1<<i))){
|
||||
log_error(" %s%d test failed\n", type, 1<<i);
|
||||
log_error(" %s%d test failed. cl_mem_flags src: %s\n", type,
|
||||
1 << i, flag_set_names[src_flag_id]);
|
||||
total_errors++;
|
||||
}
|
||||
else{
|
||||
log_info(" %s%d test passed\n", type, 1<<i);
|
||||
log_info(" %s%d test passed. cl_mem_flags src: %s\n", type,
|
||||
1 << i, flag_set_names[src_flag_id]);
|
||||
}
|
||||
|
||||
err = clEnqueueUnmapMemObject(queue, buffers[i], mappedPtr, 0, NULL, NULL);
|
||||
test_error(err, "clEnqueueUnmapMemObject failed");
|
||||
|
||||
// cleanup
|
||||
clReleaseKernel( kernel[i] );
|
||||
clReleaseProgram( program[i] );
|
||||
clReleaseMemObject( buffers[i] );
|
||||
|
||||
// If we are using the outptr[i] as backing via USE_HOST_PTR we need to make sure we are done before freeing.
|
||||
if ((flag_set[src_flag_id] & CL_MEM_USE_HOST_PTR)) {
|
||||
err = clFinish(queue);
|
||||
|
||||
Reference in New Issue
Block a user