ओपनसीएल कोड को फ़्लोचार्ट करें


ओपनसीएल कोड पर फ़्लोचार्ट बनाने में मेरी सहायता करें, मुझे समझ नहीं आ रहा है कि यह कैसा दिखना चाहिए। कोड न्यूनतम (ए+सी) ऑपरेशन करता है।

#define _CRT_SECURE_NO_WARNINGS
#define CL_USE_DEPRECATED_OPENCL_1_2_APIS
#include <CL/cl.h>
#include <CL/cl_platform.h>
#include <iostream>
#include <cstdlib>
#include <stdio.h>
 
#define MAX_SOURCE_SIZE (0x100000)
#define LIST_SIZE 128
 
int main(void) {
   int* A = new int[LIST_SIZE];
   int* C = new int[LIST_SIZE];
   int* B = new int[LIST_SIZE];
   srand(time(0));
   for (int i = 0; i < LIST_SIZE; i++) {
       A[i] = (rand() % 200) / 2.;
       C[i] = (rand() % 200) / 2.;
   }
 
   FILE* fp;
   char* source_str;
   size_t source_size;
 
   fp = fopen("kernel.cl", "r");
   if (!fp) {
       fprintf(stderr, "Failed to load kernel.\n");
       exit(1);
   }
   source_str = new char[MAX_SOURCE_SIZE];
   source_size = fread(source_str, 1, MAX_SOURCE_SIZE, fp);
   fclose(fp);
 
   cl_platform_id platform_id = NULL;
   cl_device_id device_id = NULL;
   cl_uint ret_num_devices;
   cl_uint ret_num_platforms;
   cl_int ret = clGetPlatformIDs(1, &platform_id, &ret_num_platforms);
   ret = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_DEFAULT, 1, &device_id, &ret_num_devices);
 
   
   cl_context context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &ret);
 
  
   cl_command_queue command_queue = clCreateCommandQueueWithProperties(context, device_id, 0, &ret);

   cl_mem a_mem_obj = clCreateBuffer(context, CL_MEM_READ_ONLY, LIST_SIZE * sizeof(int), NULL, &ret);
   cl_mem c_mem_obj = clCreateBuffer(context, CL_MEM_READ_ONLY, LIST_SIZE * sizeof(int), NULL, &ret);
   cl_mem b_mem_obj = clCreateBuffer(context, CL_MEM_WRITE_ONLY, LIST_SIZE * sizeof(int), NULL, &ret);
 
   ret = clEnqueueWriteBuffer(command_queue, a_mem_obj, CL_TRUE, 0, LIST_SIZE * sizeof(int), A, 0, NULL, NULL);
   ret = clEnqueueWriteBuffer(command_queue, c_mem_obj, CL_TRUE, 0, LIST_SIZE * sizeof(int), C, 0, NULL, NULL);
 
   cl_program program = clCreateProgramWithSource(context, 1, (const char**)&source_str, (const size_t*)&source_size, &ret);
 
   ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL);
 
   cl_kernel kernel = clCreateKernel(program, "krn", &ret);
 
   ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void*)&a_mem_obj);
   ret = clSetKernelArg(kernel, 1, sizeof(cl_mem), (void*)&c_mem_obj);
   ret = clSetKernelArg(kernel, 2, sizeof(cl_mem), (void*)&b_mem_obj);
 
   size_t global_item_size = LIST_SIZE;
   size_t local_item_size = 128;
   ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, &global_item_size, &local_item_size, 0, NULL, NULL);
 
  
   ret = clEnqueueReadBuffer(command_queue, b_mem_obj, CL_TRUE, 0, LIST_SIZE * sizeof(int), B, 0, NULL, NULL);
 
  
   for (int i = 0; i < LIST_SIZE; i++) {
       printf("%d. sum: %d\n", i, B[i]);
   }
   
   int min = B[0];
   int minIndex = 0;
   for (int i = 0; i < LIST_SIZE; i++) {
       if (B[i] < min) {
           min = B[i];
           minIndex = i;
       }
   }
   printf("\n\n%d. Minimum min(A+C) = %d\n", minIndex, min);
 
   ret = clFlush(command_queue);
   ret = clFinish(command_queue);
   ret = clReleaseKernel(kernel);
   ret = clReleaseProgram(program);
   ret = clReleaseMemObject(a_mem_obj);
   ret = clReleaseMemObject(c_mem_obj);
   ret = clReleaseMemObject(b_mem_obj);
   ret = clReleaseCommandQueue(command_queue);
   ret = clReleaseContext(context);
   delete[] source_str;
   delete[] A;
   delete[] B;
   delete[] C;
   return 0;
}

मैंने क्या प्रयास किया है:

I wrote the code, but I don't understand at all what the flowchart should look like

समाधान 1

ओपनसीएल कोड के लिए फ़्लोचार्ट बनाने में चरणों के साथ प्रोग्राम के तार्किक प्रवाह का प्रतिनिधित्व करना शामिल है। ध्यान दें कि ओपनसीएल प्रोग्रामिंग में आमतौर पर होस्ट (सीपीयू) और डिवाइस (जीपीयू) कोड प्रवाह दोनों शामिल होते हैं। गाइड के रूप में नीचे दिए गए लिंक को जांचें और अपना कोड बनाने का प्रयास करें।

[^]

इसके अलावा, आप ‘की जांच कर सकते हैं

OpenCL program flow

नीचे दिए गए लिंक में अनुभाग बनाएं और उसके अनुसार चरण बनाएं।उदाहरण के द्वारा ओपनसीएल प्रोग्रामिंग[^]

コメント

タイトルとURLをコピーしました