私は90年代後半に書かれた既存のシングルスレッドCプログラムにCUDAを追加しようとしています。なぜgccとNVCC(g ++)は2つの異なる構造サイズを参照していますか?
これを行うには、CとC++(nvccはC++コンパイラ)という2つの言語を混在させる必要があります。
問題は、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ファイルには、私のメイクファイルは
のように見えるstruct TB {
int nbranch, nnode, root, branches[NBRANCH][2];
double lnL;
} tree;
...
のように見えるstructInfo.hと
#include "structInfo.h"
...
のように見えます
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。 1つの4バイト整列および少なくとも8バイトアラインメントと相互に動作している:
nvcc warning : option 'host-compilation' has been deprecated and is ignored
パディングに違いはありますか? nvccとgcc(あなたがccとして使用していると思われるもの)は互換性がありますか?編集:実際には、nvccの埋め込み問題に関連する何かを読む、待機する –
これは、32ビットまたは64ビットプラットフォームですか? [パラメータを移動する](https://devtalk.nvidia.com/default/topic/394418/padding-problem-nvcc-bug-/)を試してみてください。 –
@EsaLakaniemiこれは32ビットプラットフォームです。 – Mikhail