@@ -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
104104const 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+ };
570584int 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+
734873REGISTER_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