不知道如何处理“nvcc致命错误”

5
我在Ubuntu终端中使用命令行。 我正在尝试编译CUDA_Compiler_Driver_NVCC.pdf中提供的三个文件。当我使用文档中给出的这三个文件的命令行时,我会得到以下错误:nvcc致命错误:“不知道如何处理'-dc'”。如果我删除命令行中的-dc,则也会出现以下错误:nvcc致命错误:“不知道如何处理'-arch=sm=20'”。 有人知道我该如何解决这个问题吗?非常感谢您的帮助。 以下是我在终端输入的命令行和文件。 使用的命令行: nvcc – arch = sm_20 – dc a.cu b.cu nvcc – arch = sm_20 a.o b.o 文件代码(只需复制文档):(看起来粘贴时代码样式改变了,对此小问题表示抱歉)
******* b.h ***********
#define N 8

extern __device__ int g[N];
extern __device__ void bar(void);

******* b.cu***********
#include "b.h"
__device__ int g[N];
__device__ void bar (void)
{
g[threadIdx.x]++;
}

******* a.cu ***********
#include <stdio.h>

#include "b.h"

__global__ void foo (void) {
__shared__ int a[N];
a[threadIdx.x] = threadIdx.x;
__syncthreads();
g[threadIdx.x] = a[blockDim.x - threadIdx.x - 1];
}

bar();

int main (void) {
unsigned int i;
int *dg, hg[N];

int sum = 0;

foo<<<1, N>>>();

if(cudaGetSymbolAddress((void**)&dg, g)){
printf("couldn't get the symbol addr\n");
return 1;
}

if(cudaMemcpy(hg, dg, N * sizeof(int), cudaMemcpyDeviceToHost)){
printf("couldn't memcpy\n");
return 1;
}

for (i = 0; i < N; i++) {
sum += hg[i];
}

if (sum == 36) {
printf("PASSED\n");
} else {
printf("FAILED (%d)\n", sum);
}

return 0;
}

你能提供所提到的PDF的链接吗?我查看了nvcc manpage,但它没有像-dc--arch这样的标志。此外,我认为--arch指定目标硬件架构,所以我不明白为什么要给两次。 - Filip Malczak
-arch 用于指定我使用的架构类型。我尝试了所有的 sm_21、sm_13 等等,似乎错误并不是由此引起的。我想知道是否出现了配置问题或其他原因。可能我错了,因为我对 Ubuntu 还很陌生。 - Gibo
但是你没有指定代码。我还处于“搜索主题”的阶段,而不是“阅读这些主题”,但据我所见,你总是在-code中使用-arch,它的值可能相同。此外,请阅读其他选项,以便它们可用(也许它们仅在某些特殊编译阶段使用?)。 - Filip Malczak
嗯,在阅读了您的答案之后,我想知道这些命令是否有用。因为我使用的是GeforceGTX620,而不是Tesla类型或其他类型的显卡。这可能会有效地相关。关键是我正在尝试编译CUDA代码示例,然后我将编译新代码。 - Gibo
是的,我没有使用它,然后我得到了以下的错误信息:./a.cu(11):错误:不支持外部调用(发现非内联调用_Z3barv)。因此,在某种意义上,它似乎是一种新类型的错误。 - Gibo
显示剩余7条评论
1个回答

2

请确保您正在使用正确版本的nvcc。我曾经遇到过类似的问题,那是因为我使用的是NVCC 5.5而不是6.0。

同时,请确保破折号使用了正确的符号:使用“-”(0x2D),而不是“–”(0xD0)。


它对我真的很有用!我从互联网上复制粘贴了一些内容,但连字符不知怎么就混乱了! - eaponte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接