如何准确测量和比较opencl速度以实现循环功能的简单速度
How can I accurately measure and compare OpenCL speed for simple for loop function?
我最近使用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设备,则需要确保工作负载实际上足够大,即使设置开销也很大。
相关文章:
- 循环速度更快,有固定限制
- 循环降低到0的速度更快
- 需要帮助优化C++中循环/点积函数的速度
- OpenGL 计算着色器分离循环的速度更快
- 如何准确测量和比较opencl速度以实现循环功能的简单速度
- 循环速度要比一个一个一个一个
- 对于循环和setPixel()速度提高不起作用
- C vs Java速度(带有算术的循环)
- 创建内/外循环对象:分配和速度
- 为什么我的程序在8192个元素上循环时速度很慢
- 减慢 for 循环的速度
- 与串行相比,openMP 并行化 for 循环的速度更慢
- For 循环速度变慢
- 逐步放慢循环速度
- c++快板绘图精灵(即使没有任何循环)减慢图像速度
- 编译后首次执行速度慢得令人难以置信,除非"obvious"所有循环都将停止
- 使用openMP的for循环运行速度比串行代码慢
- dll在多大程度上加快了循环等代码中的计算速度
- 当我所做的只是将循环代码移动到函数中时,代码运行速度会慢10倍
- 如何优化 3D 复杂阵列的"for 循环"<double>以提高C++速度