Một số hàm clGet*Info OpenCL cho phép (a) lấy kích thước của thông tin được yêu cầu hoặc (b) chính thông tin đó. Điều này là cần thiết trong một số trường hợp, chẳng hạn như lấy tên của thiết bị:
tên char*;
size_t size_of_name;
clGetDeviceInfo(thiết bị, CL_DEVICE_NAME, 0, NULL, &size_of_name);
tên = (char*) malloc(size_of_name);
clGetDeviceInfo(thiết bị, CL_DEVICE_NAME, size_of_name, tên, NULL);
Tất cả các hàm clGet*Info OpenCL đều tuân theo mẫu này. Tuy nhiên, tôi thấy rằng tính năng này không hoạt động đối với clGetEventProfilingInfo() trên MacOSX. Khi tôi cố gắng lấy các kích thước như:
clGetEventProfilingInfo(evt, CL_PROFILING_COMMAND_START, 0, NULL, &info_size);
Tôi gặp lỗi -30 (CL_INVALID_VALUE) mặc dù việc triển khai trả về 8 byte trong biến info_size. Đây là một ví dụ nhỏ hoàn chỉnh về hành vi này:
#include
#if được xác định(__APPLE__) ||
#include
#else
#include
#endif
int main(int argc, const char * argv[])
{
nền tảng cl_platform_id;
cl_device_id dev;
trạng thái cl_int;
cl_uint a_buffer[1024];
cl_mem buf_dev = NULL;
cl_command_queue cq = NULL;
cl_event evt = NULL;
cl_context ctx = NULL;
cl_ulong t_start, t_end;
size_t thông tin_size;
for (int i = 0; i < 1024; i++) a_buffer[i] = (i * 7) % 100;
trạng thái = clGetPlatformIDs(1, &platf, NULL);
if (trạng thái) { printf("%d\n", status exit(-1);}
trạng thái = clGetDeviceIDs(platf, CL_DEVICE_TYPE_ALL, 1, &dev, NULL);
if (trạng thái) { printf("%d\n", status exit(-1);}
ctx = clCreateContext(NULL, 1, &dev, NULL, NULL, &status);
if (trạng thái) { printf("%d\n", status exit(-1);}
cq = clCreateCommandQueue(ctx, dev, CL_QUEUE_PROFILING_ENABLE, &status);
if (trạng thái) { printf("%d\n", status exit(-1);}
buf_dev = clCreateBuffer(ctx, CL_MEM_READ_WRITE, 1024*sizeof(cl_uint),
NULL, &trạng thái);
if (trạng thái) { printf("%d\n", status exit(-1);}
trạng thái = clEnqueueWriteBuffer(cq, buf_dev, CL_TRUE, 0,
1024*sizeof(cl_uint), a_buffer, 0, NULL, &evt);
if (trạng thái) { printf("%d\n", status exit(-1);}
trạng thái = clFinish(cq);
if (trạng thái) { printf("%d\n", status exit(-1);}
trạng thái = clGetEventProfilingInfo(evt, CL_PROFILING_COMMAND_START, 0, NULL, &info_size);
if (trạng thái) { printf("%d\n", status exit(-1);}
trạng thái = clGetEventProfilingInfo(evt, CL_PROFILING_COMMAND_START, info_size, &t_start, NULL);
if (trạng thái) { printf("%d\n", status exit(-1);}
trạng thái = clGetEventProfilingInfo(evt, CL_PROFILING_COMMAND_END, 0, NULL, &info_size);
if (trạng thái) { printf("%d\n", status exit(-1);}
trạng thái = clGetEventProfilingInfo(evt, CL_PROFILING_COMMAND_END, info_size, &t_end, NULL);
if (trạng thái) { printf("%d\n", status exit(-1);}
printf("Tổng thời gian (ns): %lu\n", (unsigned long) (t_end - t_start));
clReleaseEvent(evt);
clReleaseMemObject(buf_dev);
clReleaseCommandQueue(cq);
clReleaseContext(ctx);
return 0;
}
Nó chạy tốt trên Linux và Windows với một số triển khai OpenCL khác nhau. Trên MacOSX, tôi gặp lỗi giá trị không hợp lệ.
Tôi biết rằng hàm clGetEventProfilingInfo() luôn trả về thông tin có kích thước cl_ulong, nhưng tôi đang thực hiện việc này một cách tự động nên thông tin kích thước luôn được yêu cầu trước để phân bổ bộ nhớ cho nó.
Cảm ơn trước.
Tôi là một lập trình viên xuất sắc, rất giỏi!