[Beowulf] NVIDIA GPUs, CUDA, MD5, and "hobbyists"

Bill Broadley bill at cse.ucdavis.edu
Wed Jun 18 16:34:59 PDT 2008


Greg Lindahl wrote:
> On Wed, Jun 18, 2008 at 10:51:04AM -0400, Prentice Bisbal wrote:
> 
>> Someone made the inaccurate statement that CUDA programming is difficult
>> and time-consuming.
> 
> One data point cannot prove that CUDA is easy. There are people out
> there claiming that FPGAs are easy to program, because they're one of
> the 7 people on the planet for whom programming an FPGA is easy.

*chuckle*.

> I've looked over CUDA and some examples, and while it's better looking
> than some of the other GPU programming languages out there, it's clear
> that it is more difficult and time-consuming than using traditional
> languages on traditional cpus.

Agreed.  Traditional languages are easier, but don't express parallelism well.

One approach is of course openMP, a few pragmas, and parallel friendly (loop 
index independent) loops and you can get reasonable speedups on SMP machines.

Cuda seems to take a different approach, instead of trying to auto-parallelize
a loop, it requires a function pointer to the code, and the function must
declare it's exit condition.

CUDA seems rather similar to openMP.  Massimiliano Fatica of nvidia did a 
stream port, and I'll quote pieces of his code below.

So instead of:
for (j=0; j<N; j++)
	    b[j] = scalar*c[j];

You get:
__global__ void STREAM_Scale(float *a, float *b, float scale,  int len)
{
   int idx = threadIdx.x + blockIdx.x * blockDim.x;
   if (idx < len) b[idx] = scale* a[idx];
}

Then to actually time and launch:
   times[1][k]= mysecond();
   STREAM_Scale<<<dimGrid,dimBlock>>>(d_b, d_c, scalar,  N);
   cudaThreadSynchronize();
   times[1][k]= mysecond() -  times[1][k];

Instead of:
static double	a[N+OFFSET]

You get:
  cudaMalloc((void**)&d_a, sizeof(float)*N);

Instead of:
     for (j=0; j<N; j++) {
	a[j] = 1.0;
	b[j] = 2.0;
	c[j] = 0.0;
	}

You get:
   set_array<<<dimGrid,dimBlock>>>(d_a, 2.f, N);
   set_array<<<dimGrid,dimBlock>>>(d_b, .5f, N);
   set_array<<<dimGrid,dimBlock>>>(d_c, .5f, N);

So yes, it's a change, but it does seem pretty reasonable.




More information about the Beowulf mailing list