| 49 | |
| 50 | |
| 51 | REGISTER_TEST(svm_byte_granularity) |
| 52 | { |
| 53 | clContextWrapper contextWrapper; |
| 54 | clProgramWrapper program; |
| 55 | clKernelWrapper k1, k2; |
| 56 | clCommandQueueWrapper queues[MAXQ]; |
| 57 | |
| 58 | cl_uint num_devices = 0; |
| 59 | cl_int err = CL_SUCCESS; |
| 60 | |
| 61 | err = create_cl_objects(device, &byte_manipulation_kernels[0], |
| 62 | &contextWrapper, &program, &queues[0], &num_devices, |
| 63 | CL_DEVICE_SVM_FINE_GRAIN_BUFFER); |
| 64 | context = contextWrapper; |
| 65 | if (err == 1) |
| 66 | return 0; // no devices capable of requested SVM level, so don't execute |
| 67 | // but count test as passing. |
| 68 | if (err < 0) return -1; // fail test. |
| 69 | |
| 70 | cl_uint num_devices_plus_host = num_devices + 1; |
| 71 | |
| 72 | k1 = clCreateKernel(program, "write_owned_locations", &err); |
| 73 | test_error(err, "clCreateKernel failed"); |
| 74 | k2 = clCreateKernel(program, "sum_neighbor_locations", &err); |
| 75 | test_error(err, "clCreateKernel failed"); |
| 76 | |
| 77 | |
| 78 | cl_char *pA = (cl_char *)clSVMAlloc( |
| 79 | context, CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER, |
| 80 | sizeof(cl_char) * num_elements, 0); |
| 81 | |
| 82 | cl_uint **error_counts = (cl_uint **)malloc(sizeof(void *) * num_devices); |
| 83 | |
| 84 | for (cl_uint i = 0; i < num_devices; i++) |
| 85 | { |
| 86 | error_counts[i] = (cl_uint *)clSVMAlloc( |
| 87 | context, CL_MEM_READ_WRITE | CL_MEM_SVM_FINE_GRAIN_BUFFER, |
| 88 | sizeof(cl_uint), 0); |
| 89 | *error_counts[i] = 0; |
| 90 | } |
| 91 | for (int i = 0; i < num_elements; i++) pA[i] = -1; |
| 92 | |
| 93 | err |= clSetKernelArgSVMPointer(k1, 0, pA); |
| 94 | err |= clSetKernelArg(k1, 1, sizeof(cl_uint), &num_devices_plus_host); |
| 95 | test_error(err, "clSetKernelArg failed"); |
| 96 | |
| 97 | // get all the devices going simultaneously |
| 98 | size_t element_num = num_elements; |
| 99 | for (cl_uint d = 0; d < num_devices; d++) // device ids starting at 1. |
| 100 | { |
| 101 | err = clSetKernelArg(k1, 2, sizeof(cl_uint), &d); |
| 102 | test_error(err, "clSetKernelArg failed"); |
| 103 | err = clEnqueueNDRangeKernel(queues[d], k1, 1, NULL, &element_num, NULL, |
| 104 | 0, NULL, NULL); |
| 105 | test_error(err, "clEnqueueNDRangeKernel failed"); |
| 106 | } |
| 107 | |
| 108 | for (cl_uint d = 0; d < num_devices; d++) clFlush(queues[d]); |
nothing calls this directly
no test coverage detected