如何准确测量和比较opencl速度以实现循环功能的简单速度

How can I accurately measure and compare OpenCL speed for simple for loop function?

本文关键字:速度 循环 实现 功能 简单 测量 比较 opencl 何准确      更新时间:2023-10-16

我最近使用struct使用struct实现(测试)OPENCL来携带和更新C 类对象,并使用写入内核的简单函数,并发现我很沮丧地,当没有处理时,没有处理相同的功能,而无需处理。使用简单循环的内核实际上更快。

这是内核函数:

 __kernel void function_x_y_(__global myclass_* input,long n)
{
int gid = get_global_id(0);
if(gid<n)
input[gid].valuez = input[gid].valuey * input[gid].valuex * 8736;
}

这是for循环:

for(int i=0;i<100;i++){
thisclass[i].function_x_y();
}

和类功能:

void function_x_y(){
valuez = valuex * valuey;
}

我在两个过程上都运行了一个时钟:

cout<<"Run function in serialn";
startTime = clock();
for(int i=0;i<100;i++){
thisclass[i].function_x_y();
}
endTime = clock();
cout << "It took (serial) " << (endTime -startTime) / (CLOCKS_PER_SEC / 1000000) << " ms. " << endl;

cout<<"Run function in parallel using struct to write to objectn";
init_ocl();
startTime = clock();
load_kernel_from_struct("function_x_y_",p_struct,100);      //Loads function and variables into opencl
endTime = clock();
cout << "It took (parallel) " << (endTime -startTime) / (CLOCKS_PER_SEC / 1000000 ) << " ms. " << endl;

输出:

Run function in serial
It took (serial) 5 ms. 
Run function in parallel using struct to write to object
It took (parallel) 159010 ms. 

我正在使用Andreas Kloecker的Cl-Helper.c

我不明白这应该更快。欢迎任何帮助或建议。

是否有更准确的速度测试?这可能是由于以下事实:初始化内存并将数据传输到内核需要花费时间?

必须有一种方法来确保此工作更快的速度,我必须在运行函数之前转移和初始化所有内容?

谢谢hbyte。

您的原始测试仅使用100个元素来测试的事实应该是对正在发生的事情的相当重要的线索,尤其是因为当您的时机发生了多少变化,颠簸的迭代次数高达500万。

  • C 编译器确实擅长优化循环。尤其是迭代次数很少的循环(按10-10'000的顺序)。它可能会将您的某些逻辑折叠成更少的说明,从而超速加速。
  • opencl中有不可避免的开销
    • 内核的在线汇编
    • 需要将数据传输到/从GPU访问的内存,
    • 同步异步主机←→设备体系结构的成本
  • 由于计算设备通过利用数百个(有时甚至在相关计算设备中的数千个内核)来表现,因此,仅100个元素上的循环完全饱和(一个核心)(一个核心),但通常只会饱和到一个较分的一小部分。GPU的核心。

我建议的一件事是,仅测量对GPU的工作数据的提交和检索,而不是花费在编译内核的时间来执行您的测试,因为这将更准确地建模主机代码(显然已经事先编译了)和设备代码。

,当然,如果您打算充分利用GPGPU设备,则需要确保工作负载实际上足够大,即使设置开销也很大。