gpt4 book ai didi

performance - 为什么这个简单的 OpenCL 内核运行得这么慢?

转载 作者:行者123 更新时间:2023-12-02 09:50:16 25 4
gpt4 key购买 nike

我正在研究 OpenCL,我有点困惑为什么这个内核运行得如此缓慢,与我期望的运行速度相比。这是内核:

__kernel void copy(
const __global char* pSrc,
__global __write_only char* pDst,
int length)
{
const int tid = get_global_id(0);

if(tid < length) {
pDst[tid] = pSrc[tid];
}
}

我通过以下方式创建了缓冲区:

char* out = new char[2048*2048];
cl::Buffer(
context,
CL_MEM_USE_HOST_PTR | CL_MEM_WRITE_ONLY,
length,
out);

输入缓冲区与此相同,只是我已将 in 指针初始化为随机值。最后,我这样运行内核:

cl::Event event;
queue.enqueueNDRangeKernel(
kernel,
cl::NullRange,
cl::NDRange(length),
cl::NDRange(1),
NULL,
&event);

event.wait();

平均时间约为 75 毫秒,计算公式为:

cl_ulong startTime = event.getProfilingInfo<CL_PROFILING_COMMAND_START>();
cl_ulong endTime = event.getProfilingInfo<CL_PROFILING_COMMAND_END>();
std::cout << (endTime - startTime) * SECONDS_PER_NANO / SECONDS_PER_MILLI << "\n";

我运行的是 Windows 7,采用 Intel i5-3450 芯片(Sandy Bridge 架构)。相比之下,“直接”方式的复制时间不到 5 毫秒。我认为 event.getProfilingInfo 不包括主机和设备之间的通信时间。想法?

编辑:

根据 ananthonline 的建议,我将内核更改为使用 float4s 而不是 chars,这将平均运行时间降低到大约 50 毫秒。仍然没有我希望的那么快,但有所进步。谢谢 ananthonline!

最佳答案

我认为您的主要问题是您正在使用的 2048*2048 工作组。如果您有这么多单项工作组,系统上的 opencl 驱动程序必须管理更多的开销。如果您要使用 GPU 执行此程序,这将特别糟糕,因为您将获得非常低的硬件饱和度。

优化:使用更大的工作组调用您的内核。您甚至不必更改现有的内核。 see question: What should this size be?我在下面使用 64 作为示例。在大多数硬件上,64 恰好是一个不错的数字。

cl::size_t myOptimalGroupSize = 64;
cl::Event event;
queue.enqueueNDRangeKernel(
kernel,
cl::NullRange,
cl::NDRange(length),
cl::NDRange(myOptimalGroupSize),
NULL,
&event);

event.wait();

您还应该让内核做的不仅仅是复制单个值。我已经回答了有关全局内存的类似问题over here.

关于performance - 为什么这个简单的 OpenCL 内核运行得这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12846809/

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