| 22 | #include <algorithm> |
| 23 | |
| 24 | class CBasicTest : CTest { |
| 25 | public: |
| 26 | CBasicTest(const std::vector<std::string>& kernel) : CTest(), _kernels(kernel) { |
| 27 | |
| 28 | } |
| 29 | |
| 30 | CBasicTest(const std::string& kernel) : CTest(), _kernels(1, kernel) { |
| 31 | |
| 32 | } |
| 33 | |
| 34 | int ExecuteSubcase(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements, const std::string& src) { |
| 35 | cl_int error; |
| 36 | |
| 37 | clProgramWrapper program; |
| 38 | clKernelWrapper kernel; |
| 39 | |
| 40 | const char *srcPtr = src.c_str(); |
| 41 | |
| 42 | if (create_single_kernel_helper(context, &program, &kernel, 1, &srcPtr, |
| 43 | "testKernel")) |
| 44 | { |
| 45 | log_error("create_single_kernel_helper failed"); |
| 46 | return -1; |
| 47 | } |
| 48 | |
| 49 | size_t bufferSize = num_elements * sizeof(cl_uint); |
| 50 | clMemWrapper buffer = clCreateBuffer(context, CL_MEM_WRITE_ONLY, bufferSize, NULL, &error); |
| 51 | test_error(error, "clCreateBuffer failed"); |
| 52 | |
| 53 | error = clSetKernelArg(kernel, 0, sizeof(buffer), &buffer); |
| 54 | test_error(error, "clSetKernelArg failed"); |
| 55 | |
| 56 | size_t globalWorkGroupSize = num_elements; |
| 57 | size_t localWorkGroupSize = 0; |
| 58 | error = get_max_common_work_group_size(context, kernel, globalWorkGroupSize, &localWorkGroupSize); |
| 59 | test_error(error, "Unable to get common work group size"); |
| 60 | |
| 61 | error = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &globalWorkGroupSize, &localWorkGroupSize, 0, NULL, NULL); |
| 62 | test_error(error, "clEnqueueNDRangeKernel failed"); |
| 63 | |
| 64 | // verify results |
| 65 | std::vector<cl_uint> results(num_elements); |
| 66 | |
| 67 | error = clEnqueueReadBuffer(queue, buffer, CL_TRUE, 0, bufferSize, &results[0], 0, NULL, NULL); |
| 68 | test_error(error, "clEnqueueReadBuffer failed"); |
| 69 | |
| 70 | size_t passCount = std::count(results.begin(), results.end(), 1); |
| 71 | if (passCount != results.size()) { |
| 72 | std::vector<cl_uint>::iterator iter = std::find(results.begin(), results.end(), 0); |
| 73 | log_error("Verification on device failed at index %td\n", |
| 74 | std::distance(results.begin(), iter)); |
| 75 | log_error("%zu out of %zu failed\n", (results.size() - passCount), |
| 76 | results.size()); |
| 77 | return -1; |
| 78 | } |
| 79 | |
| 80 | return CL_SUCCESS; |
| 81 | } |
nothing calls this directly
no outgoing calls
no test coverage detected