Skip to content

Commit 40b2e4b

Browse files
jainvikas8ahesham-arm
authored andcommitted
Add test coverge for clCloneKernel with SVM pointer
Use `clSetKernelArgSVMPointer` to set args after kernel is cloned. Enqueue and read the buffer to validate. The test uses `buf_write_kernel` kernel program with 2 arguments. Signed-off-by: Michael Rizkalla <[email protected]> Co-authored-by: Vikas Katariya <[email protected]> Co-authored-by: Ahmed Hesham <[email protected]>
1 parent ec97aff commit 40b2e4b

File tree

1 file changed

+162
-17
lines changed

1 file changed

+162
-17
lines changed

test_conformance/api/test_clone_kernel.cpp

Lines changed: 162 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,10 @@ const char* clone_kernel_test_kernel[] = {
9696
)"
9797
};
9898

99-
typedef struct
99+
struct BufPtr
100100
{
101101
cl_int* store;
102-
} BufPtr;
102+
};
103103

104104
const int BUF_SIZE = 128;
105105

@@ -503,9 +503,9 @@ int test_buff_image_multiple_args(cl_device_id device, cl_context context,
503503
return TEST_PASS;
504504
}
505505

506-
int test_exec_enqueue_helper(cl_context context, cl_command_queue queue,
507-
cl_int* svmPtr_Kernel, cl_kernel srcKernel,
508-
cl_int value)
506+
int test_svm_enqueue_helper(cl_context context, cl_command_queue queue,
507+
cl_int* svmPtr_Kernel, cl_kernel srcKernel,
508+
cl_int value)
509509
{
510510
cl_int error;
511511
size_t ndrange1 = 1;
@@ -557,8 +557,7 @@ int test_svm_exec_info_helper(cl_context context, cl_command_queue queue,
557557
error = clFinish(queue);
558558
test_error(error, "clFinish failed");
559559

560-
if (test_exec_enqueue_helper(context, queue, svmPtr_Kernel, srcKernel,
561-
value)
560+
if (test_svm_enqueue_helper(context, queue, svmPtr_Kernel, srcKernel, value)
562561
!= 0)
563562
{
564563
test_fail("test_exec_enqueue_helper failed.\n");
@@ -567,6 +566,21 @@ int test_svm_exec_info_helper(cl_context context, cl_command_queue queue,
567566
return TEST_PASS;
568567
}
569568

569+
template <size_t N> struct SVMCleanup
570+
{
571+
~SVMCleanup()
572+
{
573+
for (auto ptr : ptrs)
574+
{
575+
if (ptr)
576+
{
577+
clSVMFree(context, ptr);
578+
}
579+
}
580+
}
581+
cl_context context;
582+
void* ptrs[N];
583+
};
570584
int test_cloned_kernel_exec_info(cl_device_id deviceID, cl_context context,
571585
cl_command_queue queue, int num_elements)
572586
{
@@ -600,6 +614,10 @@ int test_cloned_kernel_exec_info(cl_device_id deviceID, cl_context context,
600614
(cl_int*)clSVMAlloc(context, CL_MEM_READ_WRITE, sizeof(cl_int), 0);
601615
cl_int* svmPtr_cloneKernel_2 =
602616
(cl_int*)clSVMAlloc(context, CL_MEM_READ_WRITE, sizeof(cl_int), 0);
617+
SVMCleanup<5> cleanup{ context,
618+
{ pBuf, svmPtr_srcKernel, svmPtr_srcKernel_1,
619+
svmPtr_cloneKernel_1, svmPtr_cloneKernel_2 } };
620+
603621
test_assert_error(pBuf != NULL || svmPtr_srcKernel != NULL
604622
|| svmPtr_cloneKernel_1 != NULL
605623
|| svmPtr_srcKernel_1 != NULL
@@ -646,29 +664,23 @@ int test_cloned_kernel_exec_info(cl_device_id deviceID, cl_context context,
646664
}
647665

648666
// enqueue - cloneKernel_1 again, to check if the args were not modified
649-
if (test_exec_enqueue_helper(context, queue, svmPtr_cloneKernel_1,
650-
cloneKernel_1, intargs[1])
667+
if (test_svm_enqueue_helper(context, queue, svmPtr_cloneKernel_1,
668+
cloneKernel_1, intargs[1])
651669
!= 0)
652670
{
653671
test_fail("test_exec_enqueue_helper failed for cloneKernel_1 on "
654672
"retry.\n");
655673
}
656674

657675
// enqueue - cloneKernel_2 again, to check if the args were not modified
658-
if (test_exec_enqueue_helper(context, queue, svmPtr_cloneKernel_2,
659-
cloneKernel_2, intargs[2])
676+
if (test_svm_enqueue_helper(context, queue, svmPtr_cloneKernel_2,
677+
cloneKernel_2, intargs[2])
660678
!= 0)
661679
{
662680
test_fail("test_exec_enqueue_helper failed for cloneKernel_2 on "
663681
"retry.\n");
664682
}
665683

666-
clSVMFree(context, svmPtr_srcKernel);
667-
clSVMFree(context, svmPtr_srcKernel_1);
668-
clSVMFree(context, svmPtr_cloneKernel_1);
669-
clSVMFree(context, svmPtr_cloneKernel_2);
670-
clSVMFree(context, pBuf);
671-
672684
return TEST_PASS;
673685
}
674686
else
@@ -731,6 +743,133 @@ int test_cloned_kernel_empty_args(cl_device_id deviceID, cl_context context,
731743
return TEST_PASS;
732744
}
733745

746+
int test_svm_ptr_helper(cl_context context, cl_command_queue queue,
747+
cl_int* svmPtr_Kernel, cl_kernel srcKernel,
748+
cl_int value)
749+
{
750+
cl_int error;
751+
752+
error = clSetKernelArgSVMPointer(srcKernel, 0, svmPtr_Kernel);
753+
test_error(error, "clSetKernelArgSVMPointer failed");
754+
error = clSetKernelArg(srcKernel, 1, sizeof(cl_int), &value);
755+
test_error(error, "clSetKernelArg failed");
756+
757+
error = clFinish(queue);
758+
test_error(error, "clFinish failed");
759+
760+
if (test_svm_enqueue_helper(context, queue, svmPtr_Kernel, srcKernel, value)
761+
!= 0)
762+
{
763+
test_fail("test_svm_enqueue_helper failed.\n");
764+
}
765+
766+
return TEST_PASS;
767+
}
768+
769+
int test_cloned_kernel_svm_ptr(cl_device_id deviceID, cl_context context,
770+
cl_command_queue queue, int num_elements)
771+
{
772+
cl_int error;
773+
774+
clMemWrapper bufOut;
775+
clProgramWrapper program;
776+
clKernelWrapper srcKernel;
777+
778+
cl_int intargs[] = { 1, 2, 3, 4 };
779+
cl_device_svm_capabilities svmCaps = 0;
780+
781+
error = clGetDeviceInfo(deviceID, CL_DEVICE_SVM_CAPABILITIES,
782+
sizeof(svmCaps), &svmCaps, NULL);
783+
test_error(error, "Unable to query CL_DEVICE_SVM_CAPABILITIES");
784+
785+
if (svmCaps != 0)
786+
{
787+
error = create_single_kernel_helper(context, &program, &srcKernel, 1,
788+
clone_kernel_test_kernel,
789+
"buf_write_kernel");
790+
test_error(error, "Unable to create srcKernel");
791+
792+
cl_int* svmPtr_srcKernel =
793+
(cl_int*)clSVMAlloc(context, CL_MEM_READ_WRITE, sizeof(cl_int), 0);
794+
cl_int* svmPtr_srcKernel_1 =
795+
(cl_int*)clSVMAlloc(context, CL_MEM_READ_WRITE, sizeof(cl_int), 0);
796+
cl_int* svmPtr_cloneKernel_1 =
797+
(cl_int*)clSVMAlloc(context, CL_MEM_READ_WRITE, sizeof(cl_int), 0);
798+
cl_int* svmPtr_cloneKernel_2 =
799+
(cl_int*)clSVMAlloc(context, CL_MEM_READ_WRITE, sizeof(cl_int), 0);
800+
test_assert_error(
801+
svmPtr_srcKernel != NULL || svmPtr_cloneKernel_1 != NULL
802+
|| svmPtr_srcKernel_1 != NULL || svmPtr_cloneKernel_2 != NULL,
803+
"clSVMAlloc returned NULL");
804+
805+
// srcKernel, set args
806+
if (test_svm_ptr_helper(context, queue, svmPtr_srcKernel, srcKernel,
807+
intargs[0])
808+
!= 0)
809+
{
810+
test_fail("test_svm_ptr_helper failed for srcKernel.\n");
811+
}
812+
813+
// clone the srcKernel and set args
814+
clKernelWrapper cloneKernel_1 = clCloneKernel(srcKernel, &error);
815+
test_error(error, "clCloneKernel failed for cloneKernel_1");
816+
if (test_svm_ptr_helper(context, queue, svmPtr_cloneKernel_1,
817+
cloneKernel_1, intargs[1])
818+
!= 0)
819+
{
820+
test_fail("test_svm_ptr_helper failed for cloneKernel_1.\n");
821+
}
822+
823+
// clone the cloneKernel_1 and set args
824+
clKernelWrapper cloneKernel_2 = clCloneKernel(cloneKernel_1, &error);
825+
test_error(error, "clCloneKernel failed for cloneKernel_2");
826+
if (test_svm_ptr_helper(context, queue, svmPtr_cloneKernel_2,
827+
cloneKernel_2, intargs[2])
828+
!= 0)
829+
{
830+
test_fail("test_svm_ptr_helper failed for cloneKernel_2.\n");
831+
}
832+
833+
// enqueue - srcKernel again with different svm_ptr and args
834+
if (test_svm_ptr_helper(context, queue, svmPtr_srcKernel_1, srcKernel,
835+
intargs[3])
836+
!= 0)
837+
{
838+
test_fail("test_svm_ptr_helper failed for srcKernel with "
839+
"different values.\n");
840+
}
841+
842+
// enqueue - cloneKernel_1 again, to check if the args were not modified
843+
if (test_svm_enqueue_helper(context, queue, svmPtr_cloneKernel_1,
844+
cloneKernel_1, intargs[1])
845+
!= 0)
846+
{
847+
test_fail(
848+
"test_svm_enqueue_helper failed for cloneKernel_1 on retry.\n");
849+
}
850+
851+
// enqueue - cloneKernel_2 again, to check if the args were not modified
852+
if (test_svm_enqueue_helper(context, queue, svmPtr_cloneKernel_2,
853+
cloneKernel_2, intargs[2])
854+
!= 0)
855+
{
856+
test_fail("test_svm_enqueue_helper failed for cloneKernel_2 on "
857+
"retry.\n");
858+
}
859+
860+
clSVMFree(context, svmPtr_srcKernel);
861+
clSVMFree(context, svmPtr_srcKernel_1);
862+
clSVMFree(context, svmPtr_cloneKernel_1);
863+
clSVMFree(context, svmPtr_cloneKernel_2);
864+
865+
return TEST_PASS;
866+
}
867+
else
868+
{
869+
return TEST_SKIPPED_ITSELF;
870+
}
871+
}
872+
734873
REGISTER_TEST_VERSION(clone_kernel, Version(2, 1))
735874
{
736875
if (test_buff_image_multiple_args(device, context, queue, num_elements)
@@ -757,5 +896,11 @@ REGISTER_TEST_VERSION(clone_kernel, Version(2, 1))
757896
test_fail("clCloneKernel test_cloned_kernel_empty_args failed.\n");
758897
}
759898

899+
if (test_cloned_kernel_svm_ptr(device, context, queue, num_elements)
900+
== TEST_FAIL)
901+
{
902+
test_fail("clCloneKernel test_cloned_kernel_svm_ptr failed.\n");
903+
}
904+
760905
return TEST_PASS;
761906
}

0 commit comments

Comments
 (0)