Brook+ Programming

来源:互联网 发布:壁纸知乎 编辑:程序博客网 时间:2024/06/06 02:52

 翻译自AMD文档

2.1Runtime Options

在运行Brook+程序之前,需要注意一下环境变量:

      BRT_RUNTIME

            这个环境变量允许你决定计算的后端是CPU(可以方便地调试)还是CAL(运行于GPU之上).如果不设置,默认的是CAL.

            设置为"cpu"使用CPU后端,设置为"cal"使用CAL后端.

      BRT_ADAPTER

            这个环境变量允许你决定使用单个GPU还是多个GPU系统.第一个GPU编号是"0",第二个是"2",第N个是"n-1".如果不

            设置,默认是"0"

      BRT_PERMIT_READ_WRITE_ALIASING

            这个环境变量允许你将一个流在运行时绑定为既为输入流又为输出流的流.这不是写新代码时必须的.更多信息参见Brook+

            的安装信息

      BRT_LOG_FILE

            这个变量允许你设置一个记录内部诊断信息的文件及其位置

若在Linux下运行Brook+,注意以下变量:

      DISPLAY

             确保此变量设置为0.0以使CAL使用本地X Window server.CAL通过X Window server与GPU建立联系.

  同时确保你有足够的权限使用本地X Window server,若是远程登录,也要确保你的账户有使用X Window server的权限.

 

 

 

2.2一个简单的应用程序

 

      Brook+包含两部分:编译器和运行时库.生成一个程序包含以下步骤:

      1.使用Brook+编译器将Brook+源代码编译为包含CPU代码和流处理器的代码的C++文件;

      2.用其它编译器编译得到的C++文件并将其链接到Brook+运行时库.

 

接下来的几节将以一个小程序为例讨论编写代码、生成、运行、调试和日志记录的细节。

 

2.2.1编写代码

      下面是sum.br这个Brook+程序的源代码。它将两个流加到一起并将输出赋给第三个流。Brook+源代码的后缀名一般是".br"

      Sum.br

 

      #include <stdio.h>

      //kernel函数

      kernel void sum(float a<>,float b<>,out flaot c<>)

      {

        c = a + b;

      }

 

      int mian(int argc,char** argv)

    {

          int i,j;

 

          //声明三个10x10大小的二维流,每个流包含100个元素,每个元素是一个浮点数

          float a<10,10>;

          float b<10,10>;

          float c<10,10>;

 

          //声明三个浮点数组

          float input_a[10][10];

          float input_b[10][10];

          float input_c[10][10];

 

          //初始化

          for(i = 0;i< 10;++i)

               for(j = 0;j<10;++j)

                   {

                    input_a[i][j] = (float)i;

                    input_b[i][j] = (float)j;

                    }

           //将数组读入流

           streamRead(a,input_a);

           streamRead(b,inout_b);

 

           //调用kernel函数,此时计算运行于GPU设备上

           sum(a,b,c);

 

           //将结果写回数组

           streamWrite(c,input_c);

 

           //输出结果

           for(i = 0;i<10;++i)

           {

                 for(j = 0;j<10;++j)

                {

                    printf("%6.2f",input_c[i][j]);

                 }

                    printf("/n");

            }

 

           return 0;

}