|
| 1 | +// RUN: %clang -std=c++11 -fsycl %s -o %t.out -lstdc++ -lOpenCL -lsycl -O3 |
| 2 | +// RUN: %CPU_RUN_PLACEHOLDER %t.out |
| 3 | +// RUN: %GPU_RUN_PLACEHOLDER %t.out |
| 4 | +// RUN: %ACC_RUN_PLACEHOLDER %t.out |
| 5 | + |
| 6 | +#include <CL/sycl.hpp> |
| 7 | + |
| 8 | +#include <cassert> |
| 9 | + |
| 10 | +using namespace cl::sycl; |
| 11 | + |
| 12 | +int main() { |
| 13 | + queue Queue; |
| 14 | + if (!Queue.is_host()) { |
| 15 | + context Context = Queue.get_context(); |
| 16 | + |
| 17 | + cl_context ClContext = Context.get(); |
| 18 | + |
| 19 | + const size_t CountSources = 2; |
| 20 | + const char *Sources[CountSources] = { |
| 21 | + "kernel void foo1(global float* Array, global int* Value) { *Array = " |
| 22 | + "42; *Value = 1; }\n", |
| 23 | + "kernel void foo2(global float* Array) { int id = get_global_id(0); " |
| 24 | + "Array[id] = id; }\n", |
| 25 | + }; |
| 26 | + |
| 27 | + cl_int Err; |
| 28 | + cl_program ClProgram = clCreateProgramWithSource(ClContext, CountSources, |
| 29 | + Sources, nullptr, &Err); |
| 30 | + assert(Err == CL_SUCCESS); |
| 31 | + |
| 32 | + Err = clBuildProgram(ClProgram, 0, nullptr, nullptr, nullptr, nullptr); |
| 33 | + assert(Err == CL_SUCCESS); |
| 34 | + |
| 35 | + cl_kernel FirstCLKernel = clCreateKernel(ClProgram, "foo1", &Err); |
| 36 | + assert(Err == CL_SUCCESS); |
| 37 | + |
| 38 | + cl_kernel SecondCLKernel = clCreateKernel(ClProgram, "foo2", &Err); |
| 39 | + assert(Err == CL_SUCCESS); |
| 40 | + |
| 41 | + const size_t Count = 100; |
| 42 | + float Array[Count]; |
| 43 | + |
| 44 | + kernel FirstKernel(FirstCLKernel, Context); |
| 45 | + kernel SecondKernel(SecondCLKernel, Context); |
| 46 | + int Value; |
| 47 | + { |
| 48 | + buffer<float, 1> FirstBuffer(Array, range<1>(1)); |
| 49 | + buffer<int, 1> SecondBuffer(&Value, range<1>(1)); |
| 50 | + Queue.submit([&](handler &CGH) { |
| 51 | + CGH.set_arg(0, FirstBuffer.get_access<access::mode::write>(CGH)); |
| 52 | + CGH.set_arg(1, SecondBuffer.get_access<access::mode::write>(CGH)); |
| 53 | + CGH.single_task(FirstKernel); |
| 54 | + }); |
| 55 | + } |
| 56 | + Queue.wait_and_throw(); |
| 57 | + |
| 58 | + assert(Array[0] == 42); |
| 59 | + assert(Value == 1); |
| 60 | + |
| 61 | + { |
| 62 | + buffer<float, 1> FirstBuffer(Array, range<1>(Count)); |
| 63 | + Queue.submit([&](handler &CGH) { |
| 64 | + auto Acc = FirstBuffer.get_access<access::mode::read_write>(CGH); |
| 65 | + CGH.set_arg(0, FirstBuffer.get_access<access::mode::read_write>(CGH)); |
| 66 | + CGH.parallel_for(range<1>{Count}, SecondKernel); |
| 67 | + }); |
| 68 | + } |
| 69 | + Queue.wait_and_throw(); |
| 70 | + |
| 71 | + for (size_t I = 0; I < Count; ++I) { |
| 72 | + assert(Array[I] == I); |
| 73 | + } |
| 74 | + |
| 75 | + clReleaseContext(ClContext); |
| 76 | + clReleaseKernel(FirstCLKernel); |
| 77 | + clReleaseKernel(SecondCLKernel); |
| 78 | + clReleaseProgram(ClProgram); |
| 79 | + } |
| 80 | + return 0; |
| 81 | +} |
0 commit comments