View difference between Paste ID: 84Q5WtD9 and 5qw72D5z
SHOW: | | - or go back to the newest paste.
1
#include <stdio.h>
2
 
3
#define THREADX 16
4
#define THREADY 16
5
6
#define BLOCKSX 16
7
#define BLOCKSY 16
8
 
9
__global__ 
10-
void kern(char *skey, int *ans) 
10+
void kern(char *skey, char *solution, int *ans) 
11
{
12
    char key[ 8 ];
13
    key[ 0 ] = skey[ 0 ];
14
    key[ 1 ] = skey[ 1 ];
15
    key[ 2 ] = skey[ 2 ];
16
    key[ 3 ] = skey[ 3 ];
17
    key[ 4 ] = blockIdx.x;
18
    key[ 5 ] = blockIdx.y;
19
20
    key[ 6 ] = threadIdx.x;
21
    key[ 7 ] = threadIdx.y;
22
23-
    int a = 0x86289CFB;
23+
    long long a = 0x86289CFB;
24-
    int b = 0x48AEEFD4;
24+
    long long b = 0x48AEEFD4;
25
    int i;
26
    for (i = 0; i < 8; i++) {
27
        char code = key[i];
28
        int xor1 = a >> 31;
29
        int xor2 = 0;
30
        int j = 0;
31
        while (j < 64) {
32
            if ((((b & 0x40BD223D) << 32) + (a & 0x61AC9F6E)) & (1 << j)) xor2++;
33
            j++;
34
        }
35
        xor2 = xor2 & 1;
36
        switch (code)
37
        {
38
            case 0:
39
                a = a * 2 ^ 0x4;
40
                b = b * 2;
41
                //printf( "a = %lld   b = %lld\n", a, b );
42
                break;
43
            case 1:
44
                a = a * 2;
45
                b = (b * 2) ^ 0x2;
46
                //printf( "[1] a = %d   b = %d\n", a, b );
47
                break;
48
            case 2:
49
                a = a * 2;
50
                b = b * 2;
51
                //printf( "a = %lld   b = %lld\n", a, b );
52
                break;
53
            case 3:
54
                b = b * 2;
55
                a = a * 2 ^ 0x80000000;
56
                //printf( "a = %lld   b = %lld\n", a, b );
57
                break;
58
            case 4:
59
                b = b * 2 ^ 0x40000000;
60
                a = a * 2;
61
                //printf( "a = %lld   b = %lld\n", a, b );
62
                break;
63
            case 5:
64
                b = b * 2;
65
                a = a * 2 ^ 0x20000000;
66
                //printf( "a = %lld   b = %lld\n", a, b );
67
                break;
68
            case 6:
69
                b = b * 2 ^ 0x10000000;
70
                a = a * 2;
71
                //printf( "a = %lld   b = %lld\n", a, b );
72
                break;
73
            case 7:
74
                b = b * 2;
75
                a = a * 2 ^ 0x8000000;
76
                //printf( "a = %lld   b = %lld\n", a, b );
77
                break;
78
            case 8:
79
                b = b * 2 ^ 0x4000000;
80
                a = a * 2;
81
                //printf( "a = %lld   b = %lld\n", a, b );
82
                break;
83
            case 9:
84
                b = b * 2;
85
                a = a * 2 ^ 0x2000000;
86
                //printf( "a = %lld   b = %lld\n", a, b );
87
                break;
88
            case 10:
89
                b = b * 2 ^ 0x1000000;
90
                a = a * 2 ^ 1;
91
                //printf( "a = %lld   b = %lld\n", a, b );
92
                break;
93
            case 11:
94
                b = b * 2;
95
                a = a * 2 ^ 0x800000;
96
                //printf( "a = %lld   b = %lld\n", a, b );
97
                break;
98
            case 12:
99
                b = b * 2 ^ 0x400000;
100
                a = a * 2;
101
                //printf( "a = %lld   b = %lld\n", a, b );
102
                break;
103
            case 13:
104
                b = b * 2;
105
                a = a * 2 ^ 0x200000;
106
                //printf( "a = %lld   b = %lld\n", a, b );
107
                break;
108
            case 14:
109
                b = b * 2 ^ 0x100000;
110
                a = a * 2;
111
                //printf( "a = %lld   b = %lld\n", a, b );
112
                break;
113
            case 15:
114
                b = b * 2;
115
                a = a * 2 ^ 0x80000;
116
                //printf( "a = %lld   b = %lld\n", a, b );
117
                break;
118
            default:
119
                break;
120
        }
121
        //printf( "-a- %lld\n", a );
122
        //printf( "-b- %lld\n", b );
123
        //printf( "-x- %d\n", xor1 );
124
        //printf( "-x- %d\n", xor2 );
125
        a = a ^ xor2;
126
        b = b ^ xor1;
127
        a = a & 0xffffffff;
128
        b = b & 0xffffffff;
129
    }
130
    int n,m;
131
    n = (b << 15) + (a >> 17);
132
    m = b ^ n & 0x40BD223D;
133-
    //if( m == 0xF0E6D69A )
133+
    if( m == 0xF0E6D69A )  // <<< real
134-
    if( m == 0xff46d75e )
134+
    {
135
        for( int k = 0; k < 8; k++ )
136
            solution[ k ] = key[ k ];
137
    //if( m == 0x51182aa2 )
138
    //if( m == 0xff46d75e )
139
        //*ans = threadIdx.x * 100 + threadIdx.y;
140
        *ans = 1;
141
    }
142
}
143
 
144
int main()
145
{
146-
    char *d_key;
146+
147
	int *d_ans, ans, zero = 0;
148
    cudaMalloc( (void**)&d_ans, 1 * sizeof( int ) ); 
149
150
    char key[ 8 ] = { 1, 2, 3, 10, 11, 12, 13, 14 };
151
    char *d_key, *d_sol;
152
    cudaMalloc( (void**)&d_key, 8 * sizeof( char ) ); 
153
    cudaMalloc( (void**)&d_sol, 8 * sizeof( char ) ); 
154
155
    for( key[ 0 ] = 0; key[ 0 ] < 16; key[ 0 ]++ )
156
        for( key[ 1 ] = 0; key[ 1 ] < 16; key[ 1 ]++ )
157
            for( key[ 2 ] = 0; key[ 2 ] < 16; key[ 2 ]++ )
158
                for( key[ 3 ] = 0; key[ 3 ] < 16; key[ 3 ]++ )
159
                {
160
                    /////////// copy
161-
                    kern<<<dimGrid, dimBlock>>>(d_key, d_ans);
161+
162
                    cudaMemcpy( d_ans, &zero, 1 * sizeof( int ) , cudaMemcpyHostToDevice ); 
163
164
                    /////////// execute
165
                    dim3 dimBlock( THREADX, THREADY );
166
                    dim3 dimGrid( BLOCKSX, BLOCKSY );
167
                    kern<<<dimGrid, dimBlock>>>(d_key, d_sol, d_ans);
168
169
                    /////////// take back
170
                    cudaMemcpy( &ans, d_ans, 1 * sizeof( int ), cudaMemcpyDeviceToHost ); 
171
                    if( ans )
172
                    {
173
                        printf("FOUND - %d\n", ans);
174
                        cudaMemcpy( &key, d_sol, 8 * sizeof( char ), cudaMemcpyDeviceToHost ); 
175
                        for( int k = 0; k < 8; k++ )
176
                            printf( "%d ", key[ k ] );
177
                        printf( "\n" );
178
                        for( int k = 0; k < 8; k++ )
179
                        {
180
                            if( key[ k ] < 10 )
181
                                printf( "%c", key[ k ] + 0x30 );
182
                            else
183
                                printf( "%c", key[ k ] + 0x61 - 10 );
184
                        }
185
                        printf( "\n" );
186
187
                        cudaFree( d_key );
188
                        cudaFree( d_sol );
189
                        cudaFree( d_ans );
190
                        return EXIT_SUCCESS;
191
                    }
192
                }
193
194
        cudaFree( d_sol );
195
	cudaFree( d_key );
196
	cudaFree( d_ans );
197
	
198
	return EXIT_SUCCESS;
199
}