gpt4 book ai didi

MacOSX 中的 clGetEventProfilingInfo() 错误?

转载 作者:太空宇宙 更新时间:2023-11-03 23:26:28 25 4
gpt4 key购买 nike

几个 clGet*Info OpenCL 函数允许 (a) 获取所需信息的大小,或 (b) 信息本身。这在某些情况下是必需的,例如获取设备的名称:

char* name;
size_t size_of_name;
clGetDeviceInfo(device, CL_DEVICE_NAME, 0, NULL, &size_of_name);
name = (char*) malloc(size_of_name);
clGetDeviceInfo(device, CL_DEVICE_NAME, size_of_name, name, NULL);

所有 clGet*Info OpenCL 函数都遵循此模式。但是,我发现这对 MacOSX 中的 clGetEventProfilingInfo() 不起作用。当我尝试获取尺寸时,例如:

clGetEventProfilingInfo(evt, CL_PROFILING_COMMAND_START, 0, NULL, &info_size);

我得到一个错误 -30 (CL_INVALID_VALUE),尽管实现在 info_size 变量中返回了 8 个字节。这是此行为的一个完整的小示例:

#include <stdio.h>

#if defined(__APPLE__) || defined(__MACOSX)
#include <OpenCL/OpenCL.h>
#else
#include <CL/opencl.h>
#endif

int main(int argc, const char * argv[])
{

cl_platform_id platf;
cl_device_id dev;
cl_int status;
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 info_size;

for (int i = 0; i < 1024; i++) a_buffer[i] = (i * 7) % 100;

status = clGetPlatformIDs(1, &platf, NULL);
if (status) { printf("%d\n", status); exit(-1);}

status = clGetDeviceIDs(platf, CL_DEVICE_TYPE_ALL, 1, &dev, NULL);
if (status) { printf("%d\n", status); exit(-1);}

ctx = clCreateContext(NULL, 1, &dev, NULL, NULL, &status);
if (status) { printf("%d\n", status); exit(-1);}

cq = clCreateCommandQueue(ctx, dev, CL_QUEUE_PROFILING_ENABLE, &status);
if (status) { printf("%d\n", status); exit(-1);}

buf_dev = clCreateBuffer(ctx, CL_MEM_READ_WRITE, 1024*sizeof(cl_uint),
NULL, &status);
if (status) { printf("%d\n", status); exit(-1);}

status = clEnqueueWriteBuffer(cq, buf_dev, CL_TRUE, 0,
1024*sizeof(cl_uint), a_buffer, 0, NULL, &evt);
if (status) { printf("%d\n", status); exit(-1);}

status = clFinish(cq);
if (status) { printf("%d\n", status); exit(-1);}

status = clGetEventProfilingInfo(evt, CL_PROFILING_COMMAND_START, 0, NULL, &info_size);
if (status) { printf("%d\n", status); exit(-1);}

status = clGetEventProfilingInfo(evt, CL_PROFILING_COMMAND_START, info_size, &t_start, NULL);
if (status) { printf("%d\n", status); exit(-1);}

status = clGetEventProfilingInfo(evt, CL_PROFILING_COMMAND_END, 0, NULL, &info_size);
if (status) { printf("%d\n", status); exit(-1);}

status = clGetEventProfilingInfo(evt, CL_PROFILING_COMMAND_END, info_size, &t_end, NULL);
if (status) { printf("%d\n", status); exit(-1);}

printf("Total time (ns): %lu\n", (unsigned long) (t_end - t_start));

clReleaseEvent(evt);
clReleaseMemObject(buf_dev);
clReleaseCommandQueue(cq);
clReleaseContext(ctx);

return 0;
}

它在具有多种不同 OpenCL 实现的 Linux 和 Windows 中运行良好。在 MacOSX 中,我收到无效值错误。

我知道 clGetEventProfilingInfo() 函数总是返回大小为 cl_ulong 的信息,但是我以自动方式执行此操作,因此总是在之前请求大小信息以便为其分配内存。

提前致谢。

最佳答案

我已经在我自己的 OS X 系统上运行了您的示例代码并获得了相同的结果。有趣的是,info_size 输出变量填充了正确的值(8 字节),尽管产生了错误代码。

这绝对是一个错误 - 规范指出 clGetEventProfilingInfo 应该只为 param_value_size 返回 CL_INVALID_VALUE 如果 param_value不是 NULL(正如您指出的,与所有其他 clGet*Info 函数相同)。

您可以在此处向 Apple 报告此类错误: https://developer.apple.com/bug-reporting/

关于MacOSX 中的 clGetEventProfilingInfo() 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26145603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com