// // Copyright (c) 2017 The Khronos Group Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include "harness/compat.h" #include #include #include #include #include "procs.h" #include "harness/conversions.h" extern MTdata d; // The tests we are running const char *tests[] = { "+", "-", "*", "/", "%", "&", "|", "^", ">>", "<<", ">>", "<<", "~", "?:", "&&", "||", "<", ">", "<=", ">=", "==", "!=", "!", }; // The names of the tests const char *test_names[] = { "+", // 0 "-", // 1 "*", // 2 "/", // 3 "%", // 4 "&", // 5 "|", // 6 "^", // 7 ">> by vector", // 8 "<< by vector", // 9 ">> by scalar", // 10 "<< by scalar", // 11 "~", // 12 "?:", // 13 "&&", // 14 "||", // 15 "<", // 16 ">", // 17 "<=", // 18 ">=", // 19 "==", // 20 "!=", // 21 "!", // 22 }; const size_t vector_aligns[] = {0, 1, 2, 4, 4, 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16}; // ======================================= // long // ======================================= int verify_long(int test, size_t vector_size, cl_long *inptrA, cl_long *inptrB, cl_long *outptr, size_t n) { cl_long r, shift_mask = (sizeof(cl_long)*8)-1; size_t i, j; int count=0; for (j=0; j> (inptrB[i] & shift_mask); break; case 9: r = inptrA[i] << (inptrB[i] & shift_mask); break; case 10: r = inptrA[i] >> (inptrB[j] & shift_mask); break; case 11: r = inptrA[i] << (inptrB[j] & shift_mask); break; case 12: r = ~inptrA[i]; break; case 13: r = (inptrA[j] < inptrB[j]) ? inptrA[i] : inptrB[i]; break; case 14: // Scalars are set to 1/0 r = inptrA[i] && inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 15: // Scalars are set to 1/0 r = inptrA[i] || inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 16: // Scalars are set to 1/0 r = inptrA[i] < inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 17: // Scalars are set to 1/0 r = inptrA[i] > inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 18: // Scalars are set to 1/0 r = inptrA[i] <= inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 19: // Scalars are set to 1/0 r = inptrA[i] >= inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 20: // Scalars are set to 1/0 r = inptrA[i] == inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 21: // Scalars are set to 1/0 r = inptrA[i] != inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 22: // Scalars are set to 1/0 r = !inptrA[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; default: log_error("Invalid test: %d\n", test); return -1; break; } if (r != outptr[i]) { // Shift is tricky if (test == 8 || test == 9) { log_error("cl_long Verification failed at element %ld of %ld : 0x%llx %s 0x%llx = 0x%llx, got 0x%llx\n", i, n, inptrA[i], tests[test], inptrB[i], r, outptr[i]); log_error("\t1) Vector shift failure at element %ld: original is 0x%llx %s %d (0x%llx)\n", i, inptrA[i], tests[test], (int)inptrB[i], inptrB[i]); log_error("\t2) Take the %d LSBs of the shift to get the final shift amount %lld (0x%llx).\n", (int)log2(sizeof(cl_long)*8), inptrB[i]&shift_mask, inptrB[i]&shift_mask); } else if (test == 10 || test == 11) { log_error("cl_long Verification failed at element %ld of %ld (%ld): 0x%llx %s 0x%llx = 0x%llx, got 0x%llx\n", i, n, j, inptrA[i], tests[test], inptrB[j], r, outptr[i]); log_error("\t1) Scalar shift failure at element %ld: original is 0x%llx %s %d (0x%llx)\n", i, inptrA[i], tests[test], (int)inptrB[j], inptrB[j]); log_error("\t2) Take the %d LSBs of the shift to get the final shift amount %lld (0x%llx).\n", (int)log2(sizeof(cl_long)*8), inptrB[j]&shift_mask, inptrB[j]&shift_mask); } else if (test == 13) { log_error("cl_int Verification failed at element %ld (%ld): (0x%llx < 0x%llx) ? 0x%llx : 0x%llx = 0x%llx, got 0x%llx\n", i, j, inptrA[j], inptrB[j], inptrA[i], inptrB[i], r, outptr[i]); } else { log_error("cl_long Verification failed at element %ld of %ld: 0x%llx %s 0x%llx = 0x%llx, got 0x%llx\n", i, n, inptrA[i], tests[test], inptrB[i], r, outptr[i]); } count++; if (count >= MAX_ERRORS_TO_PRINT) { log_error("Further errors ignored.\n"); return -1; } } } } if (count) return -1; else return 0; } void init_long_data(uint64_t indx, int num_elements, cl_long *input_ptr[], MTdata d) { cl_ulong *p = (cl_ulong *)input_ptr[0]; int j; if (indx == 0) { // Do the tricky values the first time around fill_test_values( input_ptr[ 0 ], input_ptr[ 1 ], (size_t)num_elements, d ); } else { // Then just test lots of random ones. for (j=0; j> (inptrB[i] & shift_mask); break; case 9: r = inptrA[i] << (inptrB[i] & shift_mask); break; case 10: r = inptrA[i] >> (inptrB[j] & shift_mask); break; case 11: r = inptrA[i] << (inptrB[j] & shift_mask); break; case 12: r = ~inptrA[i]; break; case 13: r = (inptrA[j] < inptrB[j]) ? inptrA[i] : inptrB[i]; break; case 14: // Scalars are set to 1/0 r = inptrA[i] && inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 15: // Scalars are set to 1/0 r = inptrA[i] || inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 16: // Scalars are set to 1/0 r = inptrA[i] < inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 17: // Scalars are set to 1/0 r = inptrA[i] > inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 18: // Scalars are set to 1/0 r = inptrA[i] <= inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 19: // Scalars are set to 1/0 r = inptrA[i] >= inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 20: // Scalars are set to 1/0 r = inptrA[i] == inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 21: // Scalars are set to 1/0 r = inptrA[i] != inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 22: // Scalars are set to 1/0 r = !inptrA[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; default: log_error("Invalid test: %d\n", test); return -1; break; } if (r != outptr[i]) { // Shift is tricky if (test == 8 || test == 9) { log_error("cl_ulong Verification failed at element %ld of %ld: 0x%llx %s 0x%llx = 0x%llx, got 0x%llx\n", i, n, inptrA[i], tests[test], inptrB[i], r, outptr[i]); log_error("\t1) Shift failure at element %ld: original is 0x%llx %s %d (0x%llx)\n", i, inptrA[i], tests[test], (int)inptrB[i], inptrB[i]); log_error("\t2) Take the %d LSBs of the shift to get the final shift amount %llu (0x%llx).\n", (int)log2(sizeof(cl_ulong)*8), inptrB[i]&shift_mask, inptrB[i]&shift_mask); } else if (test == 10 || test == 11) { log_error("cl_ulong Verification failed at element %ld of %ld (%ld): 0x%llx %s 0x%llx = 0x%llx, got 0x%llx\n", i, n, j, inptrA[i], tests[test], inptrB[j], r, outptr[i]); log_error("\t1) Scalar shift failure at element %ld: original is 0x%llx %s %d (0x%llx)\n", i, inptrA[i], tests[test], (int)inptrB[j], inptrB[j]); log_error("\t2) Take the %d LSBs of the shift to get the final shift amount %lld (0x%llx).\n", (int)log2(sizeof(cl_long)*8), inptrB[j]&shift_mask, inptrB[j]&shift_mask); } else if (test == 13) { log_error("cl_int Verification failed at element %ld of %ld (%ld): (0x%llx < 0x%llx) ? 0x%llx : 0x%llx = 0x%llx, got 0x%llx\n", i, n, j, inptrA[j], inptrB[j], inptrA[i], inptrB[i], r, outptr[i]); } else { log_error("cl_ulong Verification failed at element %ld of %ld: 0x%llx %s 0x%llx = 0x%llx, got 0x%llx\n", i, n, inptrA[i], tests[test], inptrB[i], r, outptr[i]); } count++; if (count >= MAX_ERRORS_TO_PRINT) { log_error("Further errors ignored.\n"); return -1; } } } } if (count) return -1; else return 0; } void init_ulong_data(uint64_t indx, int num_elements, cl_ulong *input_ptr[], MTdata d) { cl_ulong *p = (cl_ulong *)input_ptr[0]; int j; if (indx == 0) { // Do the tricky values the first time around fill_test_values( (cl_long*)input_ptr[ 0 ], (cl_long*)input_ptr[ 1 ], (size_t)num_elements, d ); } else { // Then just test lots of random ones. for (j=0; j> (inptrB[i] & shift_mask); break; case 9: r = inptrA[i] << (inptrB[i] & shift_mask); break; case 10: r = inptrA[i] >> (inptrB[j] & shift_mask); break; case 11: r = inptrA[i] << (inptrB[j] & shift_mask); break; case 12: r = ~inptrA[i]; break; case 13: r = (inptrA[j] < inptrB[j]) ? inptrA[i] : inptrB[i]; break; case 14: // Scalars are set to 1/0 r = inptrA[i] && inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 15: // Scalars are set to 1/0 r = inptrA[i] || inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 16: // Scalars are set to 1/0 r = inptrA[i] < inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 17: // Scalars are set to 1/0 r = inptrA[i] > inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 18: // Scalars are set to 1/0 r = inptrA[i] <= inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 19: // Scalars are set to 1/0 r = inptrA[i] >= inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 20: // Scalars are set to 1/0 r = inptrA[i] == inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 21: // Scalars are set to 1/0 r = inptrA[i] != inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 22: // Scalars are set to 1/0 r = !inptrA[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; default: log_error("Invalid test: %d\n", test); return -1; break; } if (r != outptr[i]) { // Shift is tricky if (test == 8 || test == 9) { log_error("cl_int Verification failed at element %ld: 0x%x %s 0x%x = 0x%x, got 0x%x\n", i, inptrA[i], tests[test], inptrB[i], r, outptr[i]); log_error("\t1) Shift failure at element %ld: original is 0x%x %s %d (0x%x)\n", i, inptrA[i], tests[test], (int)inptrB[i], inptrB[i]); log_error("\t2) Take the %d LSBs of the shift to get the final shift amount %d (0x%x).\n", (int)log2(sizeof(cl_int)*8), inptrB[i]&shift_mask, inptrB[i]&shift_mask); } else if (test == 10 || test == 11) { log_error("cl_int Verification failed at element %ld (%ld): 0x%x %s 0x%x = 0x%x, got 0x%x\n", i, j, inptrA[i], tests[test], inptrB[j], r, outptr[i]); log_error("\t1) Scalar shift failure at element %ld: original is 0x%x %s %d (0x%x)\n", i, inptrA[i], tests[test], (int)inptrB[j], inptrB[j]); log_error("\t2) Take the %d LSBs of the shift to get the final shift amount %d (0x%x).\n", (int)log2(sizeof(cl_int)*8), inptrB[j]&shift_mask, inptrB[j]&shift_mask); } else if (test == 13) { log_error("cl_int Verification failed at element %ld (%ld): (0x%x < 0x%x) ? 0x%x : 0x%x = 0x%x, got 0x%x\n", i, j, inptrA[j], inptrB[j], inptrA[i], inptrB[i], r, outptr[i]); } else { log_error("cl_int Verification failed at element %ld: 0x%x %s 0x%x = 0x%x, got 0x%x\n", i, inptrA[i], tests[test], inptrB[i], r, outptr[i]); } count++; if (count >= MAX_ERRORS_TO_PRINT) { log_error("Further errors ignored.\n"); return -1; } } } } if (count) return -1; else return 0; } void init_int_data(uint64_t indx, int num_elements, cl_int *input_ptr[], MTdata d) { static const cl_int specialCaseList[] = { 0, -1, 1, CL_INT_MIN, CL_INT_MIN + 1, CL_INT_MAX }; int j; // Set the inputs to a random number for (j=0; j> (inptrB[i] & shift_mask); break; case 9: r = inptrA[i] << (inptrB[i] & shift_mask); break; case 10: r = inptrA[i] >> (inptrB[j] & shift_mask); break; case 11: r = inptrA[i] << (inptrB[j] & shift_mask); break; case 12: r = ~inptrA[i]; break; case 13: r = (inptrA[j] < inptrB[j]) ? inptrA[i] : inptrB[i]; break; case 14: // Scalars are set to 1/0 r = inptrA[i] && inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 15: // Scalars are set to 1/0 r = inptrA[i] || inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 16: // Scalars are set to 1/0 r = inptrA[i] < inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 17: // Scalars are set to 1/0 r = inptrA[i] > inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 18: // Scalars are set to 1/0 r = inptrA[i] <= inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 19: // Scalars are set to 1/0 r = inptrA[i] >= inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 20: // Scalars are set to 1/0 r = inptrA[i] == inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 21: // Scalars are set to 1/0 r = inptrA[i] != inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 22: // Scalars are set to 1/0 r = !inptrA[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; default: log_error("Invalid test: %d\n", test); return -1; break; } if (r != outptr[i]) { // Shift is tricky if (test == 8 || test == 9) { log_error("cl_uint Verification failed at element %ld: 0x%x %s 0x%x = 0x%x, got 0x%x\n", i, inptrA[i], tests[test], inptrB[i], r, outptr[i]); log_error("\t1) Shift failure at element %ld: original is 0x%x %s %d (0x%x)\n", i, inptrA[i], tests[test], (int)inptrB[i], inptrB[i]); log_error("\t2) Take the %d LSBs of the shift to get the final shift amount %d (0x%x).\n", (int)log2(sizeof(cl_uint)*8), inptrB[i]&shift_mask, inptrB[i]&shift_mask); } else if (test == 10 || test == 11) { log_error("cl_uint Verification failed at element %ld (%ld): 0x%x %s 0x%x = 0x%x, got 0x%x\n", i, j, inptrA[i], tests[test], inptrB[j], r, outptr[i]); log_error("\t1) Scalar shift failure at element %ld: original is 0x%x %s %d (0x%x)\n", i, inptrA[i], tests[test], (int)inptrB[j], inptrB[j]); log_error("\t2) Take the %d LSBs of the shift to get the final shift amount %d (0x%x).\n", (int)log2(sizeof(cl_uint)*8), inptrB[j]&shift_mask, inptrB[j]&shift_mask); } else if (test == 13) { log_error("cl_int Verification failed at element %ld (%ld): (0x%x < 0x%x) ? 0x%x : 0x%x = 0x%x, got 0x%x\n", i, j, inptrA[j], inptrB[j], inptrA[i], inptrB[i], r, outptr[i]); } else { log_error("cl_uint Verification failed at element %ld: 0x%x %s 0x%x = 0x%x, got 0x%x\n", i, inptrA[i], tests[test], inptrB[i], r, outptr[i]); } count++; if (count >= MAX_ERRORS_TO_PRINT) { log_error("Further errors ignored.\n"); return -1; } } } } if (count) return -1; else return 0; } void init_uint_data(uint64_t indx, int num_elements, cl_uint *input_ptr[], MTdata d) { static cl_uint specialCaseList[] = { 0, (cl_uint) CL_INT_MAX, (cl_uint) CL_INT_MAX + 1, CL_UINT_MAX-1, CL_UINT_MAX }; int j; // Set the first input to an incrementing number // Set the second input to a random number for (j=0; j> (inptrB[i] & shift_mask); break; case 9: r = inptrA[i] << (inptrB[i] & shift_mask); break; case 10: r = inptrA[i] >> (inptrB[j] & shift_mask); break; case 11: r = inptrA[i] << (inptrB[j] & shift_mask); break; case 12: r = ~inptrA[i]; break; case 13: r = (inptrA[j] < inptrB[j]) ? inptrA[i] : inptrB[i]; break; case 14: // Scalars are set to 1/0 r = inptrA[i] && inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 15: // Scalars are set to 1/0 r = inptrA[i] || inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 16: // Scalars are set to 1/0 r = inptrA[i] < inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 17: // Scalars are set to 1/0 r = inptrA[i] > inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 18: // Scalars are set to 1/0 r = inptrA[i] <= inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 19: // Scalars are set to 1/0 r = inptrA[i] >= inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 20: // Scalars are set to 1/0 r = inptrA[i] == inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 21: // Scalars are set to 1/0 r = inptrA[i] != inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 22: // Scalars are set to 1/0 r = !inptrA[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; default: log_error("Invalid test: %d\n", test); return -1; break; } if (r != outptr[i]) { // Shift is tricky if (test == 8 || test == 9) { log_error("cl_short Verification failed at element %ld: 0x%x %s 0x%x = 0x%x, got 0x%x\n", i, inptrA[i], tests[test], inptrB[i], r, outptr[i]); log_error("\t1) Shift failure at element %ld: original is 0x%x %s %d (0x%x)\n", i, inptrA[i], tests[test], (int)inptrB[i], inptrB[i]); log_error("\t2) Take the %d LSBs of the shift to get the final shift amount %d (0x%x).\n", (int)log2(sizeof(cl_short)*8), inptrB[i]&shift_mask, inptrB[i]&shift_mask); } else if (test == 10 || test == 11) { log_error("cl_short Verification failed at element %ld (%ld): 0x%x %s 0x%x = 0x%x, got 0x%x\n", i, j, inptrA[i], tests[test], inptrB[j], r, outptr[i]); log_error("\t1) Scalar shift failure at element %ld: original is 0x%x %s %d (0x%x)\n", i, inptrA[i], tests[test], (int)inptrB[j], inptrB[j]); log_error("\t2) Take the %d LSBs of the shift to get the final shift amount %d (0x%x).\n", (int)log2(sizeof(cl_short)*8), inptrB[j]&shift_mask, inptrB[j]&shift_mask); } else if (test == 13) { log_error("cl_int Verification failed at element %ld (%ld): (0x%x < 0x%x) ? 0x%x : 0x%x = 0x%x, got 0x%x\n", i, j, inptrA[j], inptrB[j], inptrA[i], inptrB[i], r, outptr[i]); } else { log_error("cl_short Verification failed at element %ld: 0x%x %s 0x%x = 0x%x, got 0x%x\n", i, inptrA[i], tests[test], inptrB[i], r, outptr[i]); } count++; if (count >= MAX_ERRORS_TO_PRINT) { log_error("Further errors ignored.\n"); return -1; } } } } if (count) return -1; else return 0; } void init_short_data(uint64_t indx, int num_elements, cl_short *input_ptr[], MTdata d) { static const cl_short specialCaseList[] = { 0, -1, 1, CL_SHRT_MIN, CL_SHRT_MIN + 1, CL_SHRT_MAX }; int j; // Set the inputs to a random number for (j=0; j> 16); } // Init the first few values to test special cases { size_t x, y, index = 0; for( x = 0; x < sizeof( specialCaseList ) / sizeof( specialCaseList[0] ); x++ ) for( y = 0; y < sizeof( specialCaseList ) / sizeof( specialCaseList[0] ); y++ ) { ((cl_short *)input_ptr[0])[index] = specialCaseList[x]; ((cl_short *)input_ptr[1])[index++] = specialCaseList[y]; } } } // ======================================= // ushort // ======================================= int verify_ushort(int test, size_t vector_size, cl_ushort *inptrA, cl_ushort *inptrB, cl_ushort *outptr, size_t n) { cl_ushort r; cl_uint shift_mask = vector_size == 1 ? (cl_uint)(sizeof(cl_uint)*8)-1 : (cl_uint)(sizeof(cl_ushort)*8)-1; size_t i, j; int count=0; for (j=0; j> (inptrB[i] & shift_mask); break; case 9: r = inptrA[i] << (inptrB[i] & shift_mask); break; case 10: r = inptrA[i] >> (inptrB[j] & shift_mask); break; case 11: r = inptrA[i] << (inptrB[j] & shift_mask); break; case 12: r = ~inptrA[i]; break; case 13: r = (inptrA[j] < inptrB[j]) ? inptrA[i] : inptrB[i]; break; case 14: // Scalars are set to 1/0 r = inptrA[i] && inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 15: // Scalars are set to 1/0 r = inptrA[i] || inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 16: // Scalars are set to 1/0 r = inptrA[i] < inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 17: // Scalars are set to 1/0 r = inptrA[i] > inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 18: // Scalars are set to 1/0 r = inptrA[i] <= inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 19: // Scalars are set to 1/0 r = inptrA[i] >= inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 20: // Scalars are set to 1/0 r = inptrA[i] == inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 21: // Scalars are set to 1/0 r = inptrA[i] != inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 22: // Scalars are set to 1/0 r = !inptrA[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; default: log_error("Invalid test: %d\n", test); return -1; break; } if (r != outptr[i]) { // Shift is tricky if (test == 8 || test == 9) { log_error("cl_ushort Verification failed at element %ld: 0x%x %s 0x%x = 0x%x, got 0x%x\n", i, inptrA[i], tests[test], inptrB[i], r, outptr[i]); log_error("\t1) Shift failure at element %ld: original is 0x%x %s %d (0x%x)\n", i, inptrA[i], tests[test], (int)inptrB[i], inptrB[i]); log_error("\t2) Take the %d LSBs of the shift to get the final shift amount %d (0x%x).\n", (int)log2(sizeof(cl_ushort)*8), inptrB[i]&shift_mask, inptrB[i]&shift_mask); } else if (test == 10 || test == 11) { log_error("cl_ushort Verification failed at element %ld (%ld): 0x%x %s 0x%x = 0x%x, got 0x%x\n", i, j, inptrA[i], tests[test], inptrB[j], r, outptr[i]); log_error("\t1) Scalar shift failure at element %ld: original is 0x%x %s %d (0x%x)\n", i, inptrA[i], tests[test], (int)inptrB[j], inptrB[j]); log_error("\t2) Take the %d LSBs of the shift to get the final shift amount %d (0x%x).\n", (int)log2(sizeof(cl_ushort)*8), inptrB[j]&shift_mask, inptrB[j]&shift_mask); } else if (test == 13) { log_error("cl_int Verification failed at element %ld (%ld): (0x%x < 0x%x) ? 0x%x : 0x%x = 0x%x, got 0x%x\n", i, j, inptrA[j], inptrB[j], inptrA[i], inptrB[i], r, outptr[i]); } else { log_error("cl_ushort Verification failed at element %ld: 0x%x %s 0x%x = 0x%x, got 0x%x\n", i, inptrA[i], tests[test], inptrB[i], r, outptr[i]); } count++; if (count >= MAX_ERRORS_TO_PRINT) { log_error("Further errors ignored.\n"); return -1; } } } } if (count) return -1; else return 0; } void init_ushort_data(uint64_t indx, int num_elements, cl_ushort *input_ptr[], MTdata d) { static const cl_ushort specialCaseList[] = { 0, -1, 1, CL_SHRT_MAX, CL_SHRT_MAX + 1, CL_USHRT_MAX }; int j; // Set the inputs to a random number for (j=0; j> 16); } // Init the first few values to test special cases { size_t x, y, index = 0; for( x = 0; x < sizeof( specialCaseList ) / sizeof( specialCaseList[0] ); x++ ) for( y = 0; y < sizeof( specialCaseList ) / sizeof( specialCaseList[0] ); y++ ) { ((cl_ushort *)input_ptr[0])[index] = specialCaseList[x]; ((cl_ushort *)input_ptr[1])[index++] = specialCaseList[y]; } } } // ======================================= // char // ======================================= int verify_char(int test, size_t vector_size, cl_char *inptrA, cl_char *inptrB, cl_char *outptr, size_t n) { cl_char r; cl_int shift_mask = vector_size == 1 ? (cl_int)(sizeof(cl_int)*8)-1 : (cl_int)(sizeof(cl_char)*8)-1; size_t i, j; int count=0; for (j=0; j> (inptrB[i] & shift_mask); break; case 9: r = inptrA[i] << (inptrB[i] & shift_mask); break; case 10: r = inptrA[i] >> (inptrB[j] & shift_mask); break; case 11: r = inptrA[i] << (inptrB[j] & shift_mask); break; case 12: r = ~inptrA[i]; break; case 13: r = (inptrA[j] < inptrB[j]) ? inptrA[i] : inptrB[i]; break; case 14: // Scalars are set to 1/0 r = inptrA[i] && inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 15: // Scalars are set to 1/0 r = inptrA[i] || inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 16: // Scalars are set to 1/0 r = inptrA[i] < inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 17: // Scalars are set to 1/0 r = inptrA[i] > inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 18: // Scalars are set to 1/0 r = inptrA[i] <= inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 19: // Scalars are set to 1/0 r = inptrA[i] >= inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 20: // Scalars are set to 1/0 r = inptrA[i] == inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 21: // Scalars are set to 1/0 r = inptrA[i] != inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 22: // Scalars are set to 1/0 r = !inptrA[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; default: log_error("Invalid test: %d\n", test); return -1; break; } if (r != outptr[i]) { // Shift is tricky if (test == 8 || test == 9) { log_error("cl_char Verification failed at element %ld: 0x%x %s 0x%x = 0x%x, got 0x%x\n", i, inptrA[i], tests[test], inptrB[i], r, outptr[i]); log_error("\t1) Shift failure at element %ld: original is 0x%x %s %d (0x%x)\n", i, inptrA[i], tests[test], (int)inptrB[i], inptrB[i]); log_error("\t2) Take the %d LSBs of the shift to get the final shift amount %d (0x%x).\n", (int)log2(sizeof(cl_char)*8), inptrB[i]&shift_mask, inptrB[i]&shift_mask); } else if (test == 10 || test == 11) { log_error("cl_char Verification failed at element %ld (%ld): 0x%x %s 0x%x = 0x%x, got 0x%x\n", i, j, inptrA[i], tests[test], inptrB[j], r, outptr[i]); log_error("\t1) Scalar shift failure at element %ld: original is 0x%x %s %d (0x%x)\n", i, inptrA[i], tests[test], (int)inptrB[j], inptrB[j]); log_error("\t2) Take the %d LSBs of the shift to get the final shift amount %d (0x%x).\n", (int)log2(sizeof(cl_long)*8), inptrB[j]&shift_mask, inptrB[j]&shift_mask); } else if (test == 13) { log_error("cl_int Verification failed at element %ld (%ld): (0x%x < 0x%x) ? 0x%x : 0x%x = 0x%x, got 0x%x\n", i, j, inptrA[j], inptrB[j], inptrA[i], inptrB[i], r, outptr[i]); } else { log_error("cl_char Verification failed at element %ld: 0x%x %s 0x%x = 0x%x, got 0x%x\n", i, inptrA[i], tests[test], inptrB[i], r, outptr[i]); } count++; if (count >= MAX_ERRORS_TO_PRINT) { log_error("Further errors ignored.\n"); return -1; } } } } if (count) return -1; else return 0; } void init_char_data(uint64_t indx, int num_elements, cl_char *input_ptr[], MTdata d) { static const cl_char specialCaseList[] = { 0, -1, 1, CL_CHAR_MIN, CL_CHAR_MIN + 1, CL_CHAR_MAX }; int j; // FIXME comment below might not be appropriate for // vector data. Yes, checking every scalar char against every // scalar char is only 2^16 ~ 64000 tests, but once we get to vec3, // vec4, vec8... // in the meantime, this means I can use [] to access vec3 instead of // vload3 / vstore3 :D // FIXME: we really should just check every char against every char here // Set the inputs to a random number for (j=0; j> 16); } // Init the first few values to test special cases { size_t x, y, index = 0; for( x = 0; x < sizeof( specialCaseList ) / sizeof( specialCaseList[0] ); x++ ) for( y = 0; y < sizeof( specialCaseList ) / sizeof( specialCaseList[0] ); y++ ) { ((cl_char *)input_ptr[0])[index] = specialCaseList[x]; ((cl_char *)input_ptr[1])[index++] = specialCaseList[y]; } } } // ======================================= // uchar // ======================================= int verify_uchar(int test, size_t vector_size, cl_uchar *inptrA, cl_uchar *inptrB, cl_uchar *outptr, size_t n) { cl_uchar r; cl_uint shift_mask = vector_size == 1 ? (cl_uint)(sizeof(cl_uint) * 8) - 1 : (cl_uint)(sizeof(cl_uchar) * 8) - 1; size_t i, j; int count=0; for (j=0; j> (inptrB[i] & shift_mask); break; case 9: r = inptrA[i] << (inptrB[i] & shift_mask); break; case 10: r = inptrA[i] >> (inptrB[j] & shift_mask); break; case 11: r = inptrA[i] << (inptrB[j] & shift_mask); break; case 12: r = ~inptrA[i]; break; case 13: r = (inptrA[j] < inptrB[j]) ? inptrA[i] : inptrB[i]; break; case 14: // Scalars are set to 1/0 r = inptrA[i] && inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 15: // Scalars are set to 1/0 r = inptrA[i] || inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 16: // Scalars are set to 1/0 r = inptrA[i] < inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 17: // Scalars are set to 1/0 r = inptrA[i] > inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 18: // Scalars are set to 1/0 r = inptrA[i] <= inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 19: // Scalars are set to 1/0 r = inptrA[i] >= inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 20: // Scalars are set to 1/0 r = inptrA[i] == inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 21: // Scalars are set to 1/0 r = inptrA[i] != inptrB[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; case 22: // Scalars are set to 1/0 r = !inptrA[i]; // Vectors are set to -1/0 if (vector_size != 1 && r) { r = -1; } break; default: log_error("Invalid test: %d\n", test); return -1; break; } if (r != outptr[i]) { // Shift is tricky if (test == 8 || test == 9) { log_error("cl_uchar Verification failed at element %ld: 0x%x %s 0x%x = 0x%x, got 0x%x\n", i, inptrA[i], tests[test], inptrB[i], r, outptr[i]); log_error("\t1) Shift failure at element %ld: original is 0x%x %s %d (0x%x)\n", i, inptrA[i], tests[test], (int)inptrB[i], inptrB[i]); log_error("\t2) Take the %d LSBs of the shift to get the final shift amount %d (0x%x).\n", (int)log2(sizeof(cl_uchar)*8), inptrB[i]&shift_mask, inptrB[i]&shift_mask); } else if (test == 10 || test == 11) { log_error("cl_uchar Verification failed at element %ld (%ld): 0x%x %s 0x%x = 0x%x, got 0x%x\n", i, j, inptrA[i], tests[test], inptrB[j], r, outptr[i]); log_error("\t1) Scalar shift failure at element %ld: original is 0x%x %s %d (0x%x)\n", i, inptrA[i], tests[test], (int)inptrB[j], inptrB[j]); log_error("\t2) Take the %d LSBs of the shift to get the final shift amount %d (0x%x).\n", (int)log2(sizeof(cl_uchar)*8), inptrB[j]&shift_mask, inptrB[j]&shift_mask); } else if (test == 13) { log_error("cl_int Verification failed at element %ld (%ld): (0x%x < 0x%x) ? 0x%x : 0x%x = 0x%x, got 0x%x\n", i, j, inptrA[j], inptrB[j], inptrA[i], inptrB[i], r, outptr[i]); } else { log_error("cl_uchar Verification failed at element %ld: 0x%x %s 0x%x = 0x%x, got 0x%x\n", i, inptrA[i], tests[test], inptrB[i], r, outptr[i]); } count++; if (count >= MAX_ERRORS_TO_PRINT) { log_error("Further errors ignored.\n"); return -1; } } } } if (count) return -1; else return 0; } void init_uchar_data(uint64_t indx, int num_elements, cl_uchar *input_ptr[], MTdata d) { static const cl_uchar specialCaseList[] = { 0, -1, 1, CL_CHAR_MAX, CL_CHAR_MAX + 1, CL_UCHAR_MAX }; int j; // FIXME: we really should just check every char against every char here // Set the inputs to a random number for (j=0; j> 16); } // Init the first few values to test special cases { size_t x, y, index = 0; for( x = 0; x < sizeof( specialCaseList ) / sizeof( specialCaseList[0] ); x++ ) for( y = 0; y < sizeof( specialCaseList ) / sizeof( specialCaseList[0] ); y++ ) { ((cl_uchar *)input_ptr[0])[index] = specialCaseList[x]; ((cl_uchar *)input_ptr[1])[index++] = specialCaseList[y]; } } }