鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

接口调用示例

  1. 创建test.c文件。
  2. test.c文件中添加以下代码内容。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>
    #include "kvsip.h"
    #include "vsip.h"
    #include "vsip_type.h"
    
    void TestExample()
    {
        int32_t row = 4;
        int32_t col = 3;
        int64_t rowStride = 1;
        int64_t colStride = row * rowStride;
        uint64_t offset = 0;
        int32_t len = 2 * (col * colStride + offset);
        float *src1 = (float *)malloc(len * sizeof(float));
        float *src2 = (float *)malloc(len * sizeof(float));
        float *dst = (float *)malloc(len * sizeof(float));
        for (int32_t i = 0; i < len; ++i) {
            src1[i] = 1 + i / 100.0f;
            src2[i] = 2 + i / 100.0f;
        }
    
        vsip_cblock_f *block_a = vsip_cblockbind_f(src1, NULL, len, VSIP_MEM_NONE);
        vsip_cblock_f *block_b = vsip_cblockbind_f(src2, NULL, len, VSIP_MEM_NONE);
        vsip_cblock_f *block_r = vsip_cblockbind_f(dst, NULL, len, VSIP_MEM_NONE);
    
        vsip_cmview_f *a = vsip_cmbind_f(block_a, offset, colStride, col, rowStride, row);
        vsip_cblockadmit_f(block_a, VSIP_TRUE);
        vsip_cmview_f *b = vsip_cmbind_f(block_b, offset, colStride, col, rowStride, row);
        vsip_cblockadmit_f(block_b, VSIP_TRUE);
        vsip_cmview_f *r = vsip_cmbind_f(block_r, offset, colStride, col, rowStride, row);
        vsip_cblockadmit_f(block_r, VSIP_TRUE);
    
        vsip_cmadd_f(a, b, r);
    
        vsip_cmalldestroy_f(a);
        vsip_cmalldestroy_f(b);
        vsip_cmalldestroy_f(r);
    
        printf("src1:\n");
        for (int32_t i = 0; i < col; ++i) {
            for (int32_t j = 0; j < row * 2; ++j) {
                printf("%.5f ", src1[i * row * 2 + j]);
            }
            printf("\n");
        }
        printf("\nsrc2:\n");
        for (int32_t i = 0; i < col; ++i) {
            for (int32_t j = 0; j < row * 2; ++j) {
                printf("%.5f ", src2[i * row * 2 + j]);
            }
            printf("\n");
        }
        printf("\ndst:\n");
        for (int32_t i = 0; i < col; ++i) {
            for (int32_t j = 0; j < row * 2; ++j) {
                printf("%.5f ", dst[i * row * 2 + j]);
            }
            printf("\n");
        }
        free(src1);
        free(src2);
        free(dst);
    }
    
    1
    2
    3
    4
    int main(void) {
        TestExample();
        return 0;
    }
    

编译并执行示例

  • 编译文件。
    1
    gcc test.c -o test -I /usr/local/include/KVSIP/ -L /usr/local/lib/KVSIP/ -lkvsip_fft -lkvsip_fftf -lkvsip -lm -fPIC
    
  • 执行文件。
    ./test

支持多线程

VSIP库支持多线程,可以通过OMP_NUM_THREADS环境变量设置并发线程数,默认为单线程。例如配置并发线程数为8,执行如下命令:

1
export OMP_NUM_THREADS=8

问题解决

问题现象:

  1. “fatal error: vsip.h: No such file or directory”
  2. “./test: error while loading shared libraries: libkvsip.so.xxxx: cannot open shared object file: No such file or directory”

上述现象结果中涉及的xxxx代表版本号。

处理步骤:

  1. “/usr/local/include/KVSIP”“/usr/local/lib/KVSIP”目录查找是否存在头文件和动态库。
  2. “/etc/profile”中添加如下环境变量。
    export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/include/KVSIP
    export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/include/KVSIP
    if [ ! -n "$LD_LIBRARY_PATH" ]
    then
            export LD_LIBRARY_PATH=/usr/local/lib/KVSIP
    else
            export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/KVSIP
    fi
  3. 使配置文件生效。
    1
    source /etc/profile