我是 OpenCL 的新手,在数组添加方面遇到了一些问题 我使用下面链接中提供的代码
我添加了一些部分来衡量 GPU 的性能
clFinish(commandQueue);
// Queue the kernel up for execution across the array
cl_ulong start, end; cl_event k_events;
errNum = clEnqueueNDRangeKernel(commandQueue, kernel, 1, NULL,
globalWorkSize, localWorkSize,
0, NULL, &k_events);
clGetEventProfilingInfo(k_events, CL_PROFILING_COMMAND_START,
sizeof(cl_ulong), &start, NULL);
clWaitForEvents(1 , &k_events);
clGetEventProfilingInfo(k_events, CL_PROFILING_COMMAND_END,
sizeof(cl_ulong), &end, NULL);
clGetEventProfilingInfo(k_events, CL_PROFILING_COMMAND_START,
sizeof(cl_ulong), &start, NULL);
float GPUTime = (end - start);
这用来测量 CPU 时间
LARGE_INTEGER CPUstart, finish, freq;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&CPUstart);
for (int i=0;i<ARRAY_SIZE;i++){
result[i]=a[i]+b[i];
}
QueryPerformanceCounter(&finish);
double timeCPU=(finish.QuadPart - CPUstart.QuadPart) /((double)freq.QuadPart)/1000000000.0) ;
我遇到的第一个问题是数组大小;不能超过 10000;如果我这样做;它只是崩溃。如何解决?
第二个问题是性能; GPU/CPU 比例范围太宽;从 13% 到 210%(ish)。为什么会发生这种情况,您能否提出修复建议?
编辑:我想出了第二个;延迟是由省电模式引起的;它将 core/mem 设置为远低于 default 。只需使用一个程序来锁定它;性能稳定在 ~150-300 % (GPU/CPU)
好案例
GPU time :632667 nanosecs.
CPU time : 990023 nanosecs.
GPU/CPU ratio : 156.484 percent.
还有一个不好的:
GPU time :6.83267e+006 nanosecs.
CPU time : 1.00756e+006 nanosecs.
GPU/CPU ratio : 14.7462 percent.
任何想法将不胜感激。谢谢:D
PS:CPU是酷睿i3-370M;显卡:HD5470。我在 Windows 7 上使用 VS2008
最佳答案
您的程序因较大的数组大小而崩溃的一个可能(也是最可能)原因是 main.cpp
中的以下代码(原始代码中的第 274-276 行):
float result[ARRAY_SIZE];
float a[ARRAY_SIZE];
float b[ARRAY_SIZE];
这些是自动数组,它们的空间是在 main
函数的堆栈上分配的。所需的总空间为 3*ARRAY_SIZE*sizeof(float)
,等于 12*ARRAY_SIZE
。 Windows 上的默认堆栈大小为 1 MiB,这意味着 ARRAY_SIZE
可能高达 87380。这是给定默认堆栈大小的上限,并且由于堆栈也用于其他用途,因此实际值会稍微低一些。
您可以在 VS 项目属性的 Linker -> System 页面上增加堆栈大小。或者更好地使用 malloc()
或 new[]
在堆上分配这些数组。
关于c++ - 无法在阵列添加和性能问题 CPU 与 GPU 中更改超过 10000 的阵列大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11395485/