c++ - 无法在阵列添加和性能问题 CPU 与 GPU 中更改超过 10000 的阵列大小

标签 c++ arrays parallel-processing opencl performance

我是 OpenCL 的新手,在数组添加方面遇到了一些问题 我使用下面链接中提供的代码

http://code.google.com/p/opencl-book-samples/source/browse/#svn%2Ftrunk%2Fsrc%2FChapter_2%2FHelloWorld%253Fstate%253Dclosed

我添加了一些部分来衡量 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/

相关文章:

ruby - 通过正则表达式对数组进行排序的更好方法?

python - dask.delayed 导致没有加速

r - 组合迭代器,如 expand.grid

c++ - g++ 编译器标志以最小化二进制大小

c++ - Qt5:连接:如果插槽的参数少于信号,如何使用 'connect'

c# - 如何将char数组转换为int?

javascript - 在 JavaScript 数组中搜索并提取字符串

c++ - 您如何在 C 预处理器中使用定义进行逻辑异或

调用静态变量时 C++ 未解析的外部

python - 调用 scipy RectBivariateSpline 的并行化