⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reduction.br

📁 用于GPU通用计算的编程语言BrookGPU 0.4
💻 BR
字号:
#include <stdio.h>#ifdef WIN32#include <windows.h>#else#include <unistd.h>void Sleep(int n) {  usleep(1000*n);}#endif#include "main.h"#include "reduction.h"int discard;reduce void reductionKernel(float4 x<>, reduce float4 result<>) {  result += x;}kernel void reductionRegKernel(float4 x<>, float4 constant, out float4 result<>) {  result = x + constant;  if (constant.x) discard;}kernel void forceGPUFlush(float4 input<>, out float4 result<>) {  result = input;}void do_reduction(int dim, int simReduceReg, int iterations, int* time) {    int i;  float* x;  float4 result;  float4 constant;  float sum;  float4 xStrm<dim,dim>;  float4 yStrm<dim,dim>;  float4 resultStrm<1>;    float4 flush[1];  float4 flushStrm<1>;    x = (float*)malloc(sizeof(float)*dim*dim*4);    for (i=0;i<dim*dim*4;i++)    x[i] = 1.0f;    constant.x = constant.y = constant.z = constant.w = 2.0f;    streamRead(xStrm, x);  forceGPUFlush(xStrm, flushStrm);  streamRead(flushStrm, flush);    // wait for a little, make sure system is ready  //Sleep(1);    if (!simReduceReg) {        start = GetTimeTSC();            for (i=0;i<iterations;i++) {          reductionKernel(xStrm, resultStrm);      sum = result.x + result.y + result.z + result.w;    }        stop = GetTimeTSC();        //    if (fabs(sum - (4.0f*dim*dim)) > .05 )    //  printf("Error!\n");	        // printf("sum = %f\n", sum);      } else {        start = GetTimeTSC();    for (i=0;i<iterations;i++) {      reductionRegKernel(xStrm, constant, yStrm);		    }     	        forceGPUFlush(yStrm, flushStrm);    streamWrite(flushStrm, flush);	   	    stop = GetTimeTSC();                    }    //printf("%d\n", (int)(stop - start) );    *time = (int)(CyclesToUsecs(stop-start));      free(x);  }void Reduction_Time(int length) {  int size;   int simReduceReg;  int usec;  int iterations = 200;  simReduceReg = 0;  do_reduction(512, simReduceReg, 1, &usec);  printf("(* size *)  (* usec *)\n");  for (size = 2; size<=length; size*=2) {    do_reduction(size, simReduceReg, iterations, &usec);    printf("%8d    %.5f         (* kernel reduce *)\n",	   4*size*size, (float)usec / (float)iterations );  }  printf("\n\n\n");  simReduceReg = 1;  do_reduction(size, simReduceReg, iterations, &usec);  printf("(* size *)  (* usec *)\n");  for (size = 2; size<=length; size*=2) {    do_reduction(size, simReduceReg, iterations, &usec);    printf("%8d    %.5f         (* reduce reg*)\n", 4*size*size, (float)usec / (float)iterations );  }   }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -