我正在使用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。
答案 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