Guest User

Untitled

a guest
Oct 21st, 2023
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1. #include <cstdio>
  2. #include <CL/opencl.hpp>
  3. #include <chrono>
  4. #include <thread>
  5.  
  6. #define WORKER_COUNT 1024
  7.  
  8. struct packet_t {
  9.     int completed_count;
  10.     bool pending;
  11. };
  12.  
  13. bool running = true;
  14. cl_int err;
  15. const char *kernel_code = "\
  16. struct packet_t {\
  17.    int completed_count;\
  18.    bool pending;\
  19. };\
  20. __kernel void run(volatile __global struct packet_t *packet) {\
  21.    size_t tid = get_global_id(0);\
  22.    packet[tid].completed_count = 10;\
  23.    packet[tid].pending = true;\
  24. }";
  25.  
  26. void handle() {
  27.     if (err != CL_SUCCESS) {
  28.         fprintf(stderr, "Error %d!\n", err);
  29.         exit(err);
  30.     }
  31. }
  32.  
  33. int main() {
  34.     cl::Platform platform = cl::Platform::get(&err); handle(); // handle will check for errors
  35.     cl_context_properties cprops[] = { CL_CONTEXT_PLATFORM, (cl_context_properties)platform(), 0 };
  36.     cl::Context context { CL_DEVICE_TYPE_ALL, cprops, NULL, NULL, &err }; handle();
  37.     cl::CommandQueue queue(context, context.getInfo<CL_CONTEXT_DEVICES>()[0], 0, &err); handle();
  38.     cl::Event event;
  39.  
  40.     cl::Buffer packetsBuff { context, CL_MEM_ALLOC_HOST_PTR, sizeof(packet_t) * WORKER_COUNT, NULL, &err }; handle();
  41.     volatile packet_t *packets = (packet_t*)queue.enqueueMapBuffer(packetsBuff, true, CL_MAP_READ, 0, sizeof(packet_t) * WORKER_COUNT, NULL, NULL, &err);
  42.  
  43.     cl::Program program { context, kernel_code };
  44.     err = program.build(); handle();
  45.  
  46.     cl::Kernel kernel { program, "run", &err }; handle();
  47.     err = kernel.setArg(0, packetsBuff); handle();
  48.     err = queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(WORKER_COUNT), cl::NDRange(128), NULL, &event);
  49.     handle();
  50.  
  51.     event.setCallback(CL_COMPLETE, [](cl_event e, cl_int i, void *v) { running = false; });
  52.  
  53.     while (running) {
  54.         std::this_thread::sleep_for(std::chrono::milliseconds(100));
  55.         for (size_t i = 0; i < WORKER_COUNT; i++) {
  56.             if (packets[i].pending) {
  57.                 printf("Worker %d has done %d stuff.\n", packets[i].completed_count);
  58.             }
  59.         }
  60.     }
  61. }
  62.  
  63.  
Add Comment
Please, Sign In to add comment