Results 1 to 3 of 3

Thread: Difference between several runs of opencl code

  1. #1
    Junior Member
    Join Date
    Sep 2011
    Posts
    8

    Difference between several runs of opencl code

    Hello,

    I have this opencl code:


    Code :
    unsigned long permute_pc1(unsigned long src,int tid){
    	unsigned long dst = 0;
    	int srcPos = 0;
    	unsigned char permutation[] = {
    														57, 49, 41, 33, 25, 17, 9,
    													    1,  58, 50, 42, 34, 26, 18,
    													    10, 2,  59, 51, 43, 35, 27,
    													    19, 11, 3,  60, 52, 44, 36,
    													    63, 55, 47, 39, 31, 23, 15,
    														7,  62, 54, 46, 38, 30, 22,
    													    14, 6,  61, 53, 45, 37, 29,
    													    21, 13, 5,  28, 20, 12, 4
    										  };
    	if(tid<56)
    		{
    			srcPos = 64 - permutation[tid];
    			dst = (src>>srcPos & 0x01)<<(55-tid);
    		}
    	return dst;
    }
     
     
    __kernel void encrypt(__global unsigned long *message, __global unsigned long *key, __global unsigned long *encrypted)
                         {
                             unsigned int tid = get_global_id(0);
     
                             //permutarea initiala -----------------------------------------------------------
     
    						 unsigned long bit = permute_pc1(key[0],tid);
    						 __local unsigned long result[64],perm_key;
     
    						 result[tid] = 0;
    						 result[tid] = result[tid] | bit;
     
    						 barrier(CLK_LOCAL_MEM_FENCE);
    						 if (tid == 0) {
    							for (int i=0;i<56;i++) {
    								 perm_key = perm_key | result[i];
    							}
    							     encrypted[0] = perm_key;
    						 }
     
    						 /*atomic_or()*/
    						 //end of permutarea initiala ----------------------------------------------------
     
    						 //expandarea propriu-zisa -------------------------------------------------------
    						 __local unsigned long cd[16];
     
    						 if(tid==0)
    						 {
    							unsigned int c[17],d[17];
    							c[0] = (unsigned int)(perm_key>>28);
    							d[0] = (unsigned int)(perm_key & 0x0fffffff);
    							for(int i=1;i<=16;i++)
    								{
    									if((i==1)||(i==2)||(i==9)||(i==16))
    									{
    										c[i] = ((c[i-1]<<1)& 0x0FFFFFFF)|(c[i-1]>>27);
    										d[i] = ((d[i-1]<<1)& 0x0FFFFFFF)|(d[i-1]>>27);
    									}
    									else
    									{
    										c[i] = ((c[i-1]<<2)& 0x0FFFFFFF)|(c[i-1]>>26);
    										d[i] = ((d[i-1]<<2)& 0x0FFFFFFF)|(d[i-1]>>26);
    									}
    									cd[i-1] = ((unsigned long)c[i] << 28)|d[i];
    									}
     
    						 }
     
     
    						 //end of expandarea propriu-zisa -------------------------------------------------
     
     
    }


    Look at the encrypted[0] variable. I don't understand why 75% of times it evaluates to a good value(according to test values) and 25% it evaluates to some weird value. Is this an opencl error?

    Any help would be greatly appreciated.

  2. #2

    Re: Difference between several runs of opencl code

    try initializing perm_key to 0. opencl doesn't initialize automatically __local variables

  3. #3
    Junior Member
    Join Date
    Sep 2011
    Posts
    8

    Re: Difference between several runs of opencl code

    It seems ok now. Curious thing .Thanks

Similar Threads

  1. OpenCL error on multiple kernel runs
    By xargon in forum OpenCL
    Replies: 2
    Last Post: 05-17-2012, 07:47 AM
  2. Replies: 1
    Last Post: 12-06-2010, 10:39 AM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •