[PyCUDA] Histograms with PyCUDA

Francisco Villaescusa Navarro villaescusa.francisco at gmail.com
Wed Apr 4 12:07:30 PDT 2012


Thanks a lot for the quick reply!

I was wondering whether I could "count" the number of elements in a  
given interval by something such as:

moduleHistrogram = SourceModule("""
__global__ void H(float *pos, int size, float his, float lower_limit,  
float upper_limit)
{
     unsigned int idx = blockIdx.x*blockDim.x+threadIdx.x;
     unsigned int idy = blockIdx.y*blockDim.y+threadIdx.y;
     unsigned int id = idy*gridDim.x*blockDim.x+idx;

     if (id<size) {
	if (pos[id]<upper_limit && pos[id]>lower_limit){
       		his=his+1.0;
	}
     }
}
""")

I have tried this but it doesn't work (because the value of the  
variable his is not "viewed" by different threads, each of them has  
its own local value for the variable his. I also tried with the kernel:

moduleHistrogram = SourceModule("""
__global__ void H(float *pos, int size, float his, float lower_limit,  
float upper_limit)
{
     unsigned int idx = blockIdx.x*blockDim.x+threadIdx.x;
     unsigned int idy = blockIdx.y*blockDim.y+threadIdx.y;
     unsigned int id = idy*gridDim.x*blockDim.x+idx;

     __shared__ float A;
     A=his;
    __syncthreads();	

     if (id<size) {
	if (pos[id]<upper_limit && pos[id]>lower_limit){
       		A=A+1.0;
		__syncthreads();
		his=A;
	}
     }
}
""")

but the problem isn't solved.

Probably I'm doing something very stupid and I would like to know what  
it is.

Thanks a lot,

Fran.

El 04/04/2012, a las 20:32, Andreas Kloeckner escribió:

> <#part sign=pgpmime>
> On Wed, 4 Apr 2012 19:47:08 +0200, Francisco Villaescusa Navarro <villaescusa.francisco at gmail.com 
> > wrote:
>> Hi,
>>
>> I have been writing some lines for a project regarding management of
>> pretty large data sets. I have been trying to simplify the problem as
>> much as possible to understand where the problem is since I got wrong
>> results.
>>
>> The simplification of the problem is the following:
>>
>> I have a pretty long array of data containing numbers in a given
>> interval (let's suppose between 0.0 and 1.0), for example
>>
>> total_numbers=10000
>> np.random.random(total_numbers).astype(np.float32)
>>
>> I would like make a histogram of those data. I was wondering which
>> would be the best strategy to achieve this in PyCUDA.
>
> http://lmgtfy.com/?q=cuda+histogram
>
> :) (Nothing special about *Py*CUDA in this instance. In particular,
> there's no canned functionality that will do this for you.)
>
> HTH,
> Andreas




More information about the PyCUDA mailing list