Skip to content

Commit fd39b71

Browse files
Test clCloneKernel with SVM pointer
Extend test coverage by using `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]>
1 parent db1af63 commit fd39b71

File tree

1 file changed

+158
-0
lines changed

1 file changed

+158
-0
lines changed

test_conformance/api/test_clone_kernel.cpp

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
739891
REGISTER_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

Comments
 (0)