Changeset 1689 in CLRX


Ignore:
Timestamp:
Nov 10, 2015, 4:35:49 PM (5 years ago)
Author:
matszpk
Message:

CLRadeonExtender: Fixed 64-bit code for samples (illegal and hazardous v_add_i32/v_addc_u32 with scalar registers).
64-bit code for ReverseBits?.

Location:
CLRadeonExtender/trunk/samples
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/samples/ReverseBits.cpp

    r1688 r1689  
    7676        .useconstdata                       # use global const buffer (const data)
    7777    .text
     78    .if32 # 32-bit addressing
    7879        s_buffer_load_dword s0, s[4:7], 4           # local_size(0)
    79         s_buffer_load_dword s1, s[4:7], 0x18       # global_offset(0)
     80        s_buffer_load_dword s1, s[4:7], 0x18        # global_offset(0)
    8081        s_buffer_load_dword s7, s[4:7], 0x20        # constant buffer offset
    8182        s_buffer_load_dword s4, s[8:11], 0          # n
     
    99100        s_waitcnt  vmcnt(0) & lgkmcnt(0)            # wait for result and descriptor
    100101        buffer_store_byte  v1, v0, s[8:11], s6 offen  # write byte to output
     102    .else # 64-bit addressing mode
     103        s_buffer_load_dword s0, s[4:7], 4           # local_size(0)
     104        s_buffer_load_dword s1, s[4:7], 0x18        # global_offset(0)
     105        s_buffer_load_dwordx2 s[6:7], s[4:7], 0x20  # constant buffer offset
     106        s_buffer_load_dword s4, s[8:11], 0          # n
     107        s_waitcnt  lgkmcnt(0)
     108        s_mul_i32  s0, s0, s12              # local_size(0)*group_id(0)
     109        s_add_u32  s0, s1, s0               # + global_offset(0)
     110        v_add_i32  v0, vcc, s0, v0          # global_id(0)
     111        v_cmp_gt_u32  vcc, s4, v0           # n<global_id(0)
     112        s_and_saveexec_b64  s[0:1], vcc     # deactive thread with id(0)>=n
     113        s_cbranch_execz  end                # skip if no active thread
     114        s_load_dwordx4 s[8:11], s[2:3], 0x60        # load input buffer descriptor
     115        s_load_dwordx4 s[12:15], s[2:3], 0x50       # load constant buffer descriptor
     116        s_buffer_load_dwordx2 s[0:1], s[8:11], 4  # input buffer offset
     117        s_buffer_load_dwordx2 s[4:5], s[8:11], 8  # output buffer offset
     118        s_waitcnt  lgkmcnt(0)
     119        v_add_i32  v2, vcc, s0, v0         # v[2:3] - input_offset+global_id(0)
     120        v_mov_b32 v3, s1
     121        v_addc_u32  v3, vcc, v3, 0, vcc
     122        s_waitcnt  lgkmcnt(0)
     123        buffer_load_ubyte  v1, v[2:3], s[8:11], 0 addr64 # load ubyte from input
     124        s_waitcnt  vmcnt(0)
     125        s_load_dwordx4 s[8:11], s[2:3], 0x68        # load output buffer
     126        v_add_i32  v4, vcc, s6, v1         # v[4:5] - constbuf_offset+char
     127        v_mov_b32 v5, s7
     128        v_addc_u32  v5, vcc, v5, 0, vcc
     129        # convert byte (convert table in global const buffer)
     130        buffer_load_ubyte  v1, v[4:5], s[12:15], 0 addr64
     131        v_add_i32  v2, vcc, s4, v0         # v[2:3] - output_offset+global_id(0)
     132        v_mov_b32 v3, s5
     133        v_addc_u32  v3, vcc, v3, 0, vcc
     134        s_waitcnt  vmcnt(0) & lgkmcnt(0)            # wait for result and descriptor
     135        buffer_store_byte  v1, v[2:3], s[8:11], 0 addr64 # write byte to output
     136    .endif
    101137end:
    102138        s_endpgm
     
    168204        throw CLError(error, "clEnqueueReadBuffer");
    169205   
     206    /*for (size_t i = 0; i < size; i++)
     207    {   // verifying
     208        const cxbyte in = inData[i];
     209        const cxbyte expected = ((in>>7)&1) | ((in>>5)&2) | ((in>>3)&4) | ((in>>1)&8) |
     210                ((in<<1)&16) | ((in<<3)&32) | ((in<<5)&64) | ((in<<7)&128);
     211        if (expected != outData[i])
     212        {
     213            std::cerr << i << ": " << cl_uint(expected) << cl_uint(outData[i]) << std::endl;
     214            throw Exception("Data mismatch!");
     215        }
     216    }*/
    170217    // print result
    171218    for (size_t i = 0; i < size; i+=16)
  • CLRadeonExtender/trunk/samples/VectorAdd.cpp

    r1688 r1689  
    7777        v_lshlrev_b32 v0, 2, v0                 # v[0:1] - global_id(0)*4
    7878        v_add_i32 v2,vcc,s16,v0                 # v[2:3] - abuf offset + global_id(0)*2
    79         v_addc_u32 v3,vcc,s17,v1,vcc
     79        v_mov_b32 v3, s17
     80        v_addc_u32 v3,vcc,v3,v1,vcc
    8081        v_add_i32 v4,vcc,s18,v0                 # v[4:5] - bbuf offset + global_id(0)*2
    81         v_addc_u32 v5,vcc,s19,v1,vcc
     82        v_mov_b32 v5, s19
     83        v_addc_u32 v5,vcc,v5,v1,vcc
    8284        s_waitcnt lgkmcnt(0)                    # wait for results
    8385        buffer_load_dword v2, v[2:3], s[8:11], 0 addr64     # value from aBuf
    8486        buffer_load_dword v3, v[4:5], s[12:15], 0 addr64    # value from bBuf
    85     .endif 
     87    .endif
    8688        s_load_dwordx4 s[8:11], s[2:3], 14*8     # s[4:7] - cBuffer descriptor
    8789        s_waitcnt vmcnt(0)
     
    9395        v_add_f32 v2, v2, v3        # add two values
    9496        v_add_i32 v0,vcc,s6,v0                  # v[0:1] - cbuf offset + global_id(0)*2
    95         v_addc_u32 v1,vcc,s7,v1,vcc
     97        v_mov_b32 v3, s7
     98        v_addc_u32 v1,vcc,v3,v1,vcc
    9699        s_waitcnt lgkmcnt(0)         # wait for cBuf descriptor and offset
    97100        buffer_store_dword v2, v[0:1], s[8:11], 0 addr64    # value from aBuf
Note: See TracChangeset for help on using the changeset viewer.