zoukankan      html  css  js  c++  java
  • OpenCL 学习step by step (5) 使用二维NDRange workgroup

          在本教程中,我们使用二维NDRange来设置workgroup,这样在opencl中,workitme的组织形式是二维的,Kernel中 的代码也要做相应的改变,我们先看一下clEnqueueNDRangeKernel函数的变化。首先我们指定了workgroup size为localx*localy,通常这个值为64的倍数,但最好不要超过256。

    //执行kernel,Range用2维,work itmes size为width*height,
    cl_event ev;
    size_t globalThreads[] = {width, height};
    size_t localx, localy;
    if(width/8 > 4)
        localx = 16;
    else if(width < 8)
        localx = width;
    else localx = 8;

    if(height/8 > 4)
        localy = 16;
    else if (height < 8)
        localy = height;
    else localy = 8;

    size_t localThreads[] = {localx, localy}; // localx*localy应该是64的倍数
    printf("global_work_size =(%d,%d), local_work_size=(%d, %d)\n",width,height,localx,localy);

    clTimer.Reset();
    clTimer.Start();
    clEnqueueNDRangeKernel( queue,
        kernel,
        2,
        NULL,
        globalThreads,
        localThreads, 0, NULL, &ev);

    注意:在上面代码中,定义global threads以及local threads数量,都是通过二维数组的方式进行的。

        新的Kernel代码如下:

    #pragma OPENCL EXTENSION cl_amd_printf : enable

    __kernel void vecadd(__global const float* a, __global const float* b, __global float* c)
    {
    int x = get_global_id(0);
    int y = get_global_id(1);
    int width = get_global_size(0);
    int height = get_global_size(1);
    if(x == 1 && y ==1)
    printf("%d, %d,%d,%d,%d,%d\n",get_local_size(0),get_local_size(1),get_local_id(0),get_local_id(1),get_group_id(0),get_group_id(1));

    c[x + y * width] = a[x + y * width] + b[x + y * width];

    }

          我们在kernel中增加了#pragma OPENCL EXTENSION cl_amd_printf : enable,以便在kernel中通过printf函数进行debug,这是AMD的一个扩展。printf还可以直接打印出float4这样的向量,比如printf(“%v4f”, vec)。

          另外,在main.cpp中增加一行代码:

    //告诉driver dump il和isa文件
    _putenv("GPU_DUMP_DEVICE_KERNEL=3");

          我们可以在程序目录dump出il和isa形式的kernel文件,对于熟悉isa汇编的人,这是一个很好的调试performance的方法。

         在最新的app sdk 2.7及以后的sdk中,在kernel中使用printf的时候,这个程序会hang在哪儿,以前没这种情况。

    程序执行界面。

    image

    完整的代码请参考:

    工程文件gclTutorial4

    代码下载:

    https://files.cnblogs.com/mikewolf2002/gclTutorial.zip

  • 相关阅读:
    【校招面试 之 C/C++】第23题 C++ STL(五)之Set
    Cannot create an instance of OLE DB provider “OraOLEDB.Oracle” for linked server "xxxxxxx".
    Redhat Linux安装JDK 1.7
    ORA-10635: Invalid segment or tablespace type
    Symantec Backup Exec 2012 Agent for Linux 卸载
    Symantec Backup Exec 2012 Agent For Linux安装
    You must use the Role Management Tool to install or configure Microsoft .NET Framework 3.5 SP1
    YourSQLDba介绍
    PL/SQL重新编译包无反应
    MS SQL 监控数据/日志文件增长
  • 原文地址:https://www.cnblogs.com/mikewolf2002/p/2675634.html
Copyright © 2011-2022 走看看