Opencl 使用clGetEventProfilingInfo分析clEnqueueWriteBuffer
是否可以使用clGetEventProfilingInfo函数获取clEnqueueWriteBuffer函数所用的时间。我试着使用它,得到了与CL_PROFILING_COMMAND_START和CL_PROFILING_COMMAND_END相同的值。我想知道这是因为我的代码中出现了一些错误,还是因为分析对clEnqueueWriteBuffer不起作用 我的代码片段是: //写入输入缓冲区 clEnqueueWriteBuffer(队列[0],buf_A,CL_TRUE,0,分区大小*sizeof(int),输入大小+(分区大小*j),0,NULL,&事件列表[0]) 支票(cl_err,“clEnqueueWriteBuffer:buf_A”)Opencl 使用clGetEventProfilingInfo分析clEnqueueWriteBuffer,opencl,Opencl,是否可以使用clGetEventProfilingInfo函数获取clEnqueueWriteBuffer函数所用的时间。我试着使用它,得到了与CL_PROFILING_COMMAND_START和CL_PROFILING_COMMAND_END相同的值。我想知道这是因为我的代码中出现了一些错误,还是因为分析对clEnqueueWriteBuffer不起作用 我的代码片段是: //写入输入缓冲区 clEnqueueWriteBuffer(队列[0],buf_A,CL_TRUE,0,分区大小*si
clWaitForEvents(1,事件列表);
clGetEventProfilingInfo(事件列表[0],CL_PROFILING_命令_排队,sizeof(time_start_排队),time_start_排队,NULL);
clGetEventProfilingInfo(事件列表[0],CL_PROFILING_命令_START,sizeof(time_START),&time_START,NULL);
clGetEventProfilingInfo(事件列表[0],CL_PROFILING_命令_END,sizeof(time_END),&time_END,NULL);
总时间=((双倍)时间结束-时间开始)/1000000;
总排队时间=((双倍)时间结束-时间开始排队)/1000000;
最终时间数据+=总时间;
最终排队时间数据+=总排队时间;
coutYes,这个评测API应该适用于任何clEnqueue*
命令,因此OpenCL运行时中可能存在错误,或者代码有问题。如果您提供代码片段,我们可能会提供帮助。您要传输多少数据?可能是因为数据太小,传输过程中没有时间。此外,如果时间在计时器精度范围内,则可能导致结果为0。使用CL_DEVICE_PROFILING_timer_RESOLUTION检查计时器精度,通常值介于1和500nsAlso之间,请确保您的命令队列是使用CL_queue_PROFILING_ENABLE标志创建的。我在创建命令队列时已启用该标志。我正在尝试传输4MB的数据。此外,我使用的是ARM A10 APU。我的理解是,APU的GPU和CPU有一个统一的内存。那么,数据是否可能只是被映射到GPU区域而没有被复制?我以为clEnqueueWriteBuffer总是复制数据。我不确定。如果你对此有任何想法,请告诉我。提前谢谢
clWaitForEvents(1, eventList);
clGetEventProfilingInfo(eventList[0], CL_PROFILING_COMMAND_QUEUED, sizeof(time_start_queued), &time_start_queued, NULL);
clGetEventProfilingInfo(eventList[0], CL_PROFILING_COMMAND_START, sizeof(time_start), &time_start, NULL);
clGetEventProfilingInfo(eventList[0], CL_PROFILING_COMMAND_END, sizeof(time_end), &time_end, NULL);
total_time = ((double)time_end - time_start)/1000000;
total_time_queued = ((double)time_end - time_start_queued)/1000000;
final_time_data += total_time;
final_time_queued_data += total_time_queued;
cout<<"\nTime: "<<final_time_data<<" "<<final_time_queued_data;