cancel
Showing results for 
Search instead for 
Did you mean: 

Archives Discussions

adminc
Journeyman III

From a Cuda User

ATI need to fix this

I recently have been trying to port one of my cuda programs to Brook+.  I must say that the process has been extremely painful since the brook compiler is exteremely picky.  Even completely valid C code with Preprocess macros refuses to compiler inside my kernels with no helpful error messages. 

 

For example, in my program I am trying to write a simple hash bruteforcer.  The first bit of my code looks like this:

#define F1(x, y, z) (z ^ (x & (y ^ z)))
#define F2(x, y, z) F1(z, x, y)
#define F3(x, y, z) (x ^ y ^ z)
#define F4(x, y, z) (y ^ (x | ~z))

#define MD5STEP(f, w, x, y, z, data, s) \
    ( w += f(x, y, z) + data, w &= 0xffffffff, w = w<<s | w>>(32-s), w += x )

#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))

#define W(i) W##i


uint64 plainToHash(uint32 x0, uint32 x1, uint32 x2, uint32 size)
{
    uint32 a, b, c, d;

    uint32 W0, W1, W2, W3, W4, W5, W6, W7, W8, W9, W10, W11, W12, W13, W14, W15;

    a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE;  d = 0x10325476;

    W0  = x0;
    W1  = x1;
    W2  = x2;
    W3  = 0;
    W4  = 0;
    W5  = 0;
    W6  = 0;
    W7  = 0;
    W8  = 0;
    W9  = 0;
    W10 = 0;
    W11 = 0;
    W12 = 0;
    W13 = 0;
    W14 = size<<3;
    W15 = 0;


    MD5STEP(F1, a, b, c, d, W( 0)+0xd76aa478,  7);
    MD5STEP(F1, d, a, b, c, W( 1)+0xe8c7b756, 12);
    MD5STEP(F1, c, d, a, b, W( 2)+0x242070db, 17);
    MD5STEP(F1, b, c, d, a, W( 3)+0xc1bdceee, 22);
    MD5STEP(F1, a, b, c, d, W( 4)+0xf57c0faf,  7);
    MD5STEP(F1, d, a, b, c, W( 5)+0x4787c62a, 12);
    MD5STEP(F1, c, d, a, b, W( 6)+0xa8304613, 17);
    MD5STEP(F1, b, c, d, a, W( 7)+0xfd469501, 22);
    MD5STEP(F1, a, b, c, d, W( 8)+0x698098d8,  7);
    MD5STEP(F1, d, a, b, c, W( 9)+0x8b44f7af, 12);
    MD5STEP(F1, c, d, a, b, W(10)+0xffff5bb1, 17);
    MD5STEP(F1, b, c, d, a, W(11)+0x895cd7be, 22);
    MD5STEP(F1, a, b, c, d, W(12)+0x6b901122,  7);
    MD5STEP(F1, d, a, b, c, W(13)+0xfd987193, 12);
    MD5STEP(F1, c, d, a, b, W(14)+0xa679438e, 17);
    MD5STEP(F1, b, c, d, a, W(15)+0x49b40821, 22);

 

 

All of which is valid c and works in my cuda program when I compile.  Brook+ throws a fit and refuses to compile any of it.

 

I even tried preprocessing the code using a valid c compiler and using that as the source but that didn't work either. 

 

I really don't want to start developing programs for ATI products if they cant even preprocess correctly.  I am disappointed in Brook+, since I own an ATI GPU and I cannot even program with it.  Please consider fixing the little things before the big things.

 

0 Likes
4 Replies
Raistmer
Adept II

Yeah, lack of normal C language support is very painful...
In your case you probably could use some switch to brcc that enables preprocessing.
But preprocessor not fully compliant with C preprocessor too.
Look chapter 2.15 from stream computing user guide.
(sorry can't cite corresponding block, some "genius" in ATI/AMD decided to disable copying from pdf manual - really stupid action!)
0 Likes
Jawed
Adept II

uint32 isn't a data type in Brook+, nor is uint64.

0 Likes

use uint instead of uint32.

 

64 bit integers not support yet in Brook+

0 Likes

Originally posted by: genaganna use uint instead of uint32.

 

 

 

64 bit integers not support yet in Brook+

 

 

Hmmm.    I have:

 

typedef unsigned int uint32;

typedef unsigned long long int uint64;

 

 

Technically, CUDA doesnt have 64 bit datatypes either, but It works with them anyways like a good c compiler should.  Again, its the little things that need to be fixed.

 

@Raistmer: not being able to copy from a pdf?  Again, little things like that.  Its very convenient to not have to make an account to download the brook sdk.  Cuda makes everything completely public.  ATI you should take a hint.

 

0 Likes