Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vadd example on kv260 : Missing CONNECTIVITY section in xclbin #90

Open
JH989876525 opened this issue Oct 4, 2023 · 0 comments
Open

Comments

@JH989876525
Copy link

Hi all,

I am currently trying to add some HLS IP on kv260 with 2022.1 tool chain.

I have tried the basic vadd example, it could run properly on zcu104.

But with the same work flow on kv260 is not working with the same example code.

# ./vadd /lib/firmware/xilinx/app-vadd/app-vadd.xclbin 
INFO: Reading ./app-vadd/app-vadd.xclbin
Loading: './app-vadd/app-vadd.xclbin'
Trying to program device[0]: edge
Device[0]: program successful!
Segmentation fault

The info of xrt & zocl from xbutil seems to be the same between zcu104 & kv260.

# xbutil examine
System Configuration
  OS Name              : Linux
  Release              : 5.15.19-xilinx-v2022.1
  Version              : #1 SMP Mon Apr 11 17:52:14 UTC 2022
  Machine              : aarch64
  CPU Cores            : 4
  Memory               : 3929 MB
  Distribution         : PetaLinux 2022.1_release_S04190222 (honister)
  GLIBC                : 2.34
  Model                : ZynqMP SM-K26 Rev1/B/A

XRT
  Version              : 2.13.0
  Branch               : 2022.1
  Hash                 : 2a6dc026480914ea1c9f02977a6ab4b57e8a3c8d
  Hash Date            : 2022-04-12 14:31:55
  ZOCL                 : 2.13.0, 2a6dc026480914ea1c9f02977a6ab4b57e8a3c8d

Devices present
BDF             :  Shell  Platform UUID  Device ID     Device Ready*  
[0000:00:00.0]  :  edge   0x0            user(inst=0)  Yes            

* Devices that are not ready will have reduced functionality when using XRT tools

By comparing the difference between xclbin I find out :

  • The xclbin of kv260 is missing section CONNECTIVITY & GROUP_CONNECTIVITY.
    Selection_485
  • The Address Size in Memory Configuration of the xclbin for kv260 is all 0x0.
    Selection_486
  • The Memory in Instance of the xclbin for kv260 is all not applicable.
    Selection_487

Is the failure of vadd example code caused by these reason?

Or there is something I have missed?

By the way I have also verify the function with a simple xrt code which works on zcu104 but out_of_range on kv260.

# ./simpleCL.exe /lib/firmware/xilinx/app-vadd/app-vadd.xclbin 1
init
create rand value
terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check: __n (which is 0) >= this->size() (which is 0)
Aborted
#include <string>
#include "xrt/xrt_device.h"
#include "xrt/xrt_kernel.h"
#include "xrt/xrt_bo.h"
#include "xrt/xrt.h"

#define CU_NAME "krnl_vadd"

int main(int argc, char* argv[])
{
    if (argc < 3)
        return -1;

    std::cout << "init" << std::endl;
    std::string xclbin = argv[1];
    if (xclbin.empty())
        return -2;
    auto device = xrt::device(0);
    auto uuid = device.load_xclbin(xclbin);
    auto kernel = xrt::kernel(device, uuid, CU_NAME);

    int DATASIZE = atoi(argv[2]);

    int a[DATASIZE], b[DATASIZE], s[DATASIZE], o[DATASIZE];
    size_t size_in_byte = sizeof(int) * DATASIZE;

    std::cout << "create rand value" << std::endl;
    for (int i=0; i<DATASIZE; i++){
        a[i] = rand();
        b[i] = rand();
        s[i] = a[i] + b[i];
    }

    auto bo_a = xrt::bo(device, size_in_byte, kernel.group_id(0));
    auto bo_b = xrt::bo(device, size_in_byte, kernel.group_id(1));
    auto bo_o = xrt::bo(device, size_in_byte, kernel.group_id(2));

    std::cout << "write data to buffer" << std::endl;
    bo_a.write(a);
    bo_b.write(b);

    std::cout << "run" << std::endl;
    auto run = kernel(bo_a, bo_b, bo_o, DATASIZE);
    
    std::cout << "wait" << std::endl;
    int status = run.wait(10000);
    std::cout << "runner status : " << status << std::endl;

    std::cout << "read data to buffer" << std::endl;
    bo_o.read(o);
    
    for (int i=0; i<DATASIZE; i++){
        if(o[i] != s[i])
            std::cout << "value diff " << o[i] << " != " << s[i] << std::endl;
    }
    
    return 0;
};

Thanks,
JH

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant