Is it possible to have, say a array temp  to be a argument for a kernel without it being written into a cl buffer. I know in GPU we need to transfer but in smp machines, is it always needed to create a cl buffer for a kernel to access??
I believe there are just 2 types of arguments
A pointer to an opencl buffer (which can be an OpenGL buffer or a DirectX surface) and local buffers.
Local buffers are space reserved in local memory (might be the wrong term) for the duration of the kernel execution.
you create these by the call
clSetKernelArg(kernel, arg++, localMemBufferSizeInBytes, (void *)NULL);
I assume this is what you mean by a temporary array
well you can also use single value as kernel parameter. for example one float, int or vector or even single struct which can contain array which have static size. i think that for example montecarlo example from SDK use struct as parameter for kernel.