This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM5718: OpenCL例程无法运行

Part Number: AM5718


我按照openCL_lab.docx此文件所提示的步骤,执行./simple例程,报错如下:

root@am57xx-evm:/data/opencl/simple# ./simple
[ 3007.285048] CMEMK Error: mmap: can't find allocated buffer with physp 0xa2000000
CMEM Error: map: Failed to mmap buffer at physical address 0xa2000000
TIOCL FATAL: Cannot map CMEM physical memory (0xa2000000, 160 MB) into the Host virtual address space.
This is typically due to Linux system memory being near capacity.

我在源码中增加了一些打印项,发现是在执行下面这一句的时候出的错。

Context             context(CL_DEVICE_TYPE_ACCELERATOR);

我已经把dsp1的固件连接到了dra7-dsp1-fw.xe66.opencl-monitor

我的目的就是想用DSP作为一个算法加速器,请问还需要做什么别的操作才可以正常运行吗?

  • 我发现是因为dtb中增加了两个cmem_block导致的:

    reserved-memory {
    cmem_block_mem_2: cmem_block_mem@c0000000 {
    reg = <0x0 0xc0000000 0x0 0x20000000>;
    no-map;
    status = "okay";
    };
    cmem_block_mem_0: cmem_block_mem@a0000000 {
    reg = <0x0 0xa0000000 0x0 0x0c000000>;
    no-map;
    status = "okay";
    };
    };

    cmem {
    cmem_block_2: cmem_block@2 {
    reg = <2>;
    memory-region = <&cmem_block_mem_2>;
    cmem-buf-pools = <1 0x0 0x20000000>;
    };

    cmem_block_0: cmem_block@0 {
    reg = <0>;
    memory-region = <&cmem_block_mem_0>;
    cmem-buf-pools = <1 0x0 0x0c000000>;
    };
    };

    删掉这些cmem就不会报以上错误,但是还是会报以下错误:

    root@am57xx-evm:/data/opencl/simple# ./simple
    CMEM Error: init: Failed to open /dev/cmem: 'No such file or directory'
    TIOCL FATAL: The cmemk kernel module is not installed. Consult the OpenCL UserGuide at software-dl.ti.com/.../index.html
    root@am57xx-evm:/data/opencl/simple#

    那么cmemk kernel 要如何安装呢?

    另外我那两个cmem_block也是需要有的,如何可以两者兼得?

  • 我把dtb改为如下设置

    reserved-memory {
    #address-cells = <2>;
    #size-cells = <2>;
    ranges;

    cmem_block_mem_2: cmem_block_mem@c0000000 {
    reg = <0x0 0xc0000000 0x0 0x20000000>;
    no-map;
    status = "okay";
    };
    cmem_block_mem_1_ocmc3: cmem_block_mem@40500000 {
    reg = <0x0 0x40500000 0x0 0x100000>;
    no-map;
    status = "okay";
    };

    ipu2_memory_region: ipu2-memory@95800000 {
    compatible = "shared-dma-pool";
    reg = <0x0 0x95800000 0x0 0x3800000>;
    reusable;
    status = "okay";
    };

    dsp1_memory_region: dsp1-memory@99000000 {
    compatible = "shared-dma-pool";
    reg = <0x0 0x99000000 0x0 0x4000000>;
    reusable;
    status = "okay";
    };

    ipu1_memory_region: ipu1-memory@9d000000 {
    compatible = "shared-dma-pool";
    reg = <0x0 0x9d000000 0x0 0x2000000>;
    reusable;
    status = "okay";
    };
    };
    cmem {
    compatible = "ti,cmem";
    #address-cells = <1>;
    #size-cells = <0>;

    #pool-size-cells = <2>;

    status = "okay";

    cmem_block_2: cmem_block@2 {
    reg = <2>;
    memory-region = <&cmem_block_mem_2>;
    cmem-buf-pools = <1 0x0 0x20000000>;
    };
    cmem_block_1: cmem_block@1 {
    reg = <1>;
    memory-region = <&cmem_block_mem_1_ocmc3>;
    };
    };

    报错变为了:

    root@am57xx-evm:/data/opencl/simple# ./simple
    TIOCL FATAL: OpenCL needs at least one CMEM block in off-chip DDR to operate, plus optional CMEM block in on-chip (MSMC SRAM or OCMC RAM) memory.

    程序卡在里面出不来,ctrl+c也不行了。按理说我已经添加了cmem_block_mem_1_ocmc3,怎么还会报错呢?

  • 我发现是因为dtb中增加了两个cmem_block导致的:

    这部分是自己在设备树中添加的内容吗?

    程序卡在里面出不来,ctrl+c也不行了。按理说我已经添加了cmem_block_mem_1_ocmc3,怎么还会报错呢?

    使用 cat /proc/cmem 查看是否有分配成功?

    关于CMEM的详细内容请参考:

    software-dl.ti.com/.../Foundational_Components_CMEM.html