@@ -736,6 +736,158 @@ int test_cloned_kernel_empty_args(cl_device_id deviceID, cl_context context,
736736 return TEST_PASS;
737737}
738738
739+ int test_svm_enqueue_helper (cl_context context, cl_command_queue queue,
740+ cl_int* svmPtr_Kernel, cl_kernel* srcKernel,
741+ cl_int* value)
742+ {
743+ cl_int error;
744+ size_t ndrange1 = 1 ;
745+
746+ // enqueue - srcKernel
747+ error = clEnqueueNDRangeKernel (queue, *srcKernel, 1 , NULL , &ndrange1, NULL ,
748+ 0 , NULL , NULL );
749+ test_error (error, " clEnqueueNDRangeKernel failed" );
750+ error = clFinish (queue);
751+ test_error (error, " clFinish failed" );
752+
753+ error = clEnqueueSVMMap (queue, CL_TRUE, CL_MAP_READ | CL_MAP_WRITE,
754+ svmPtr_Kernel, sizeof (cl_int), 0 , NULL , NULL );
755+ test_error (error, " clEnqueueSVMMap failed" );
756+
757+ test_assert_error (svmPtr_Kernel[0 ] == *value,
758+ " clCloneKernel test failed, Failed to verify "
759+ " integer value from SVM pointer. " );
760+
761+ error = clEnqueueSVMUnmap (queue, svmPtr_Kernel, 0 , NULL , NULL );
762+ test_error (error, " clEnqueueSVMUnmap failed" );
763+ error = clFinish (queue);
764+ test_error (error, " clFinish failed" );
765+
766+ return TEST_PASS;
767+ }
768+
769+ int test_svm_ptr_helper (cl_context context, cl_command_queue queue,
770+ cl_int* svmPtr_Kernel, cl_kernel* srcKernel,
771+ cl_int* value)
772+ {
773+ cl_int error;
774+
775+ error = clSetKernelArgSVMPointer (*srcKernel, 0 , svmPtr_Kernel);
776+ test_error (error, " clSetKernelArgSVMPointer failed" );
777+ error = clSetKernelArg (*srcKernel, 1 , sizeof (cl_int), value);
778+ test_error (error, " clSetKernelArg failed" );
779+
780+ error = clFinish (queue);
781+ test_error (error, " clFinish failed" );
782+
783+ if (test_svm_enqueue_helper (context, queue, svmPtr_Kernel, srcKernel, value)
784+ != TEST_PASS)
785+ {
786+ test_fail (" test_svm_enqueue_helper failed.\n " );
787+ }
788+
789+ return TEST_PASS;
790+ }
791+
792+ int test_cloned_kernel_svm_ptr (cl_device_id deviceID, cl_context context,
793+ cl_command_queue queue, int num_elements)
794+ {
795+ cl_int error;
796+
797+ clMemWrapper bufOut;
798+ clProgramWrapper program;
799+ clKernelWrapper srcKernel;
800+
801+ cl_int intargs[] = { 1 , 2 , 3 , 4 };
802+ cl_device_svm_capabilities svmCaps = 0 ;
803+
804+ error = clGetDeviceInfo (deviceID, CL_DEVICE_SVM_CAPABILITIES,
805+ sizeof (svmCaps), &svmCaps, NULL );
806+ test_error (error, " Unable to query CL_DEVICE_SVM_CAPABILITIES" );
807+
808+ if (svmCaps != 0 )
809+ {
810+ error = create_single_kernel_helper (context, &program, &srcKernel, 1 ,
811+ clone_kernel_test_kernel,
812+ " buf_write_kernel" );
813+ test_error (error, " Unable to create srcKernel" );
814+
815+ cl_int* svmPtr_srcKernel =
816+ (cl_int*)clSVMAlloc (context, CL_MEM_READ_WRITE, sizeof (cl_int), 0 );
817+ cl_int* svmPtr_srcKernel_1 =
818+ (cl_int*)clSVMAlloc (context, CL_MEM_READ_WRITE, sizeof (cl_int), 0 );
819+ cl_int* svmPtr_cloneKernel_1 =
820+ (cl_int*)clSVMAlloc (context, CL_MEM_READ_WRITE, sizeof (cl_int), 0 );
821+ cl_int* svmPtr_cloneKernel_2 =
822+ (cl_int*)clSVMAlloc (context, CL_MEM_READ_WRITE, sizeof (cl_int), 0 );
823+ test_assert_error (
824+ svmPtr_srcKernel != NULL || svmPtr_cloneKernel_1 != NULL
825+ || svmPtr_srcKernel_1 != NULL || svmPtr_cloneKernel_2 != NULL ,
826+ " clSVMAlloc returned NULL" );
827+
828+ // srcKernel, set args
829+ if (test_svm_ptr_helper (context, queue, svmPtr_srcKernel, &srcKernel,
830+ &intargs[0 ])
831+ != TEST_PASS)
832+ {
833+ test_fail (" test_svm_ptr_helper failed for srcKernel.\n " );
834+ }
835+ clSVMFree (context, svmPtr_srcKernel);
836+
837+ // clone the srcKernel and set args
838+ clKernelWrapper cloneKernel_1 = clCloneKernel (srcKernel, &error);
839+ test_error (error, " clCloneKernel failed for cloneKernel_1" );
840+ if (test_svm_ptr_helper (context, queue, svmPtr_cloneKernel_1,
841+ &cloneKernel_1, &intargs[1 ])
842+ != TEST_PASS)
843+ {
844+ test_fail (" test_svm_ptr_helper failed for cloneKernel_1.\n " );
845+ }
846+
847+ // clone the cloneKernel_1 and set args
848+ clKernelWrapper cloneKernel_2 = clCloneKernel (cloneKernel_1, &error);
849+ test_error (error, " clCloneKernel failed for cloneKernel_2" );
850+ if (test_svm_ptr_helper (context, queue, svmPtr_cloneKernel_2,
851+ &cloneKernel_2, &intargs[2 ])
852+ != TEST_PASS)
853+ {
854+ test_fail (" test_svm_ptr_helper failed for cloneKernel_2.\n " );
855+ }
856+
857+ // enqueue - srcKernel again with different svm_ptr and args
858+ if (test_svm_ptr_helper (context, queue, svmPtr_srcKernel_1, &srcKernel,
859+ &intargs[3 ])
860+ != TEST_PASS)
861+ {
862+ test_fail (" test_svm_ptr_helper failed for srcKernel with "
863+ " different values.\n " );
864+ }
865+ clSVMFree (context, svmPtr_srcKernel_1);
866+
867+ // enqueue - cloneKernel_1 again, to check if the args were not modified
868+ if (test_svm_enqueue_helper (context, queue, svmPtr_cloneKernel_1,
869+ &cloneKernel_1, &intargs[1 ])
870+ != TEST_PASS)
871+ {
872+ test_fail (
873+ " test_svm_enqueue_helper failed for cloneKernel_1 on retry.\n " );
874+ }
875+ clSVMFree (context, svmPtr_cloneKernel_1);
876+
877+ // enqueue - cloneKernel_2 again, to check if the args were not modified
878+ if (test_svm_enqueue_helper (context, queue, svmPtr_cloneKernel_2,
879+ &cloneKernel_2, &intargs[2 ])
880+ != TEST_PASS)
881+ {
882+ test_fail (" test_svm_enqueue_helper failed for cloneKernel_2 on "
883+ " retry.\n " );
884+ }
885+ clSVMFree (context, svmPtr_cloneKernel_2);
886+ }
887+
888+ return TEST_PASS;
889+ }
890+
739891REGISTER_TEST_VERSION (clone_kernel, Version(2 , 1 ))
740892{
741893 if (test_buff_image_multiple_args (device, context, queue, num_elements)
@@ -762,5 +914,11 @@ REGISTER_TEST_VERSION(clone_kernel, Version(2, 1))
762914 test_fail (" clCloneKernel test_cloned_kernel_empty_args failed.\n " );
763915 }
764916
917+ if (test_cloned_kernel_svm_ptr (device, context, queue, num_elements)
918+ != TEST_PASS)
919+ {
920+ test_fail (" clCloneKernel test_cloned_kernel_svm_ptr failed.\n " );
921+ }
922+
765923 return TEST_PASS;
766924}
0 commit comments