查找哪个文件定义外部值

时间:2014-08-25 09:54:08

标签: matlab makefile raspberry-pi gpgpu matlab-compiler

我正在使用raspberry PI在GPU上运行一些汇编程序代码。

它的工作原理如下:您将代码组装成二进制文件。然后将其包含在将数据推入GPU的C代码中。该二进制文件定义为

extern uint32_t arrayOfCode[];

但是我找不到包含此代码的位置(它不在任何其他包含文件中)。 整个代码可以找到here

运行makefile后就可以了。 问题来自于我在Matlab中将其构建为MEX function的时候。

Matlab找不到定义汇编程序二进制代码的位置。因此,我怀疑它必须以某种方式在 Makefile 中链接,因为这是构建它的唯一区别。 有没有人知道如何找到这个外部值的定义?

==编辑1 == 我发布了我的一个解决方案,如何将其构建到Matlab库中。 但问题或多或少都是一样的。怎么这个makefile

CXX=g++

ASMSRCS := gemm_float.asm
ASMOBJS := $(subst .asm,.do,$(ASMSRCS))

CPPSRCS := $(shell find . -name '*.cpp' -not -name '._*')
CPPOBJS := $(subst .cpp,.o,$(CPPSRCS))

CPPFLAGS=-Ofast -DTARGET_PI -march=armv6 \
-mfloat-abi=hard \
-ftree-vectorize \
-funroll-all-loops \
-mfpu=vfp \

%.cdat: %.asm helpers.asm
    m4 $< | qpu-asm -o $(basename $@).cdat -c g_$(basename $@)Code

%.do: %.cdat
    $(CXX) $(CPPFLAGS) -x c -c $< -o $(basename $@).do  

%.o: %.cpp
    $(CXX) $(CPPFLAGS) -fPIC -c $< -o $(basename $@).o

gemm: $(CPPOBJS) $(ASMOBJS)
    g++ -g -O3 -o gemm $(CPPOBJS) $(ASMOBJS) -lblas

可以包含&#34; gemm_float.asm&#34;将代码汇编到使用关键字extern定义的C数组中。我读到了这些&#34;%。&#34; makefile中的规则是依赖关系的规则。好的,这意味着&#34; gemm&#34;如果我在文件中改变某些内容,那将会重新建立起来#ge; gemm&#34;依赖于取决于。或者我可能不太了解makefile。

1 个答案:

答案 0 :(得分:0)

我能够通过单独构建C代码和汇编代码来解决问题。这适用于因某些原因无法使用原始makefile的人(我正试图将其构建为mex Matlab库)。

首先,我们将code.asm构建为二进制文件

m4 code.asm | ./qpu-asm -o code.bin

现在我们必须调整我们的C代码,使其在其主要功能中加载.bin代码。我使用了eman的tutorial函数,它只是从bin文件中读取汇编代码并将其保存到数组中供以后使用。

int loadQPUCode(const char *fname, unsigned int* buffer, int len)
{
   FILE *in = fopen(fname, "r");
   if (!in) {
   fprintf(stderr, "Failed to open %s.\n", fname);
   return -1;
   }

   size_t items = fread(buffer, sizeof(unsigned int), len, in);
   fclose(in);
   return items * sizeof(unsigned int);
}      

然后在使用任何与gpu相关的函数之前调用this就足够了。

loadQPUCode("asmCode.bin",arrayOfCode,CONSTANT_RELATIVE_TO_ASMCODE);

通过这个经过调整的C代码和二进制汇编程序代码,我可以使用matlab mex函数构建Matlab库。

mex main.cpp include1.cpp include2.cpp