我正在嘗試將CUDA添加到90年代後期寫入的現有單線程C程序中。爲什麼gcc和NVCC(g ++)看到兩種不同的結構尺寸?
爲此,我需要混合兩種語言,C和C++(nvcc是C++編譯器)。
問題是,C++編譯器將結構視爲一定的大小,而C編譯看到的結構略微不同。那很糟。我真的很困惑,因爲我找不到導致4字節差異的原因。
/usr/lib/gcc/i586-suse-linux/4.3/../../../../i586-suse-linux/bin/ld: Warning: size of symbol `tree' changed from 324 in /tmp/ccvx8fpJ.o to 328 in gpu.o
我的C++看起來像
#include <stdio.h>
#include <stdlib.h>
#include "assert.h"
extern "C"
{
#include "structInfo.h" //contains the structure declaration
}
...
和我的C文件看起來像
#include "structInfo.h"
...
與structInfo.h看上去就像
struct TB {
int nbranch, nnode, root, branches[NBRANCH][2];
double lnL;
} tree;
...
我make文件看起來像
PRGS = prog
CC = cc
CFLAGS=-std=gnu99 -m32
CuCC = nvcc
CuFlags =-arch=sm_20
LIBS = -lm -L/usr/local/cuda-5.0/lib -lcuda -lcudart
all : $(PRGS)
prog:
$(CC) $(CFLAGS) prog.c gpu.o $(LIBS) -o prog
gpu.o:
$(CuCC) $(CuFlags) -c gpu.cu
有人問我爲什麼我沒有使用不同的主機編譯選項。我認爲主機編譯選項自2發佈之前已被棄用?也it never appeared to do what it said it would do。
nvcc warning : option 'host-compilation' has been deprecated and is ignored
差異是否存在填充?你確定nvcc和gcc(我認爲你使用的是cc)是兼容的嗎?編輯:其實,閱讀有關與填充問題與nvcc,支持 – 2012-12-08 22:17:38
這是一個32位或64位平臺?你可以嘗試[移動參數](https://devtalk.nvidia.com/default/topic/394418/padding-problem-nvcc-bug-/),看看是否有效? – 2012-12-08 22:20:18
@EsaLakaniemi這是一個32位平臺。 – Mikhail