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

Posted

技术标签:

【中文标题】“不知道如何处理\' nvcc 致命错误【英文标题】:"don't know what to do with' nvcc fatal error“不知道如何处理' nvcc 致命错误 【发布时间】:2014-03-29 11:27:34 【问题描述】:

我在 Ubuntu 的终端中使用命令行。

我正在尝试编译 CUDA_Compiler_Driver_NVCC.pdf 中的三个文件

当我使用这 3 个文件的文档中给出的命令行时,我确实收到以下错误:

nvcc 致命:不知道如何处理'-dc'

如果我在命令行中删除 -dc,我也会收到以下错误: nvcc 致命:不知道如何处理'-arch=sm=20'

有谁知道我该如何解决这个问题?

非常感谢您的帮助

吉博

下面是我在终端中输入的命令行,以及文件。

使用的命令行: nvcc –arch=sm_20 –dc a.cu b.cu nvcc –arch=sm_20 a.o b.o

文件代码(只是文档的复制粘贴): (好像粘贴的时候codepolicy变了,这个小问题见谅)

******* 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,这里是 p46-47:docs.nvidia.com/cuda/pdf/CUDA_Compiler_Driver_NVCC.pdf 阅读第 6 章(本 pdf 的第 29 页)以了解 -arch 标志的说明。仍在搜索任何提及-dc -arch 用于指定我使用的架构类型。我尝试了所有 sm_21 sm_13 等。似乎错误不是来自于此。我想知道是出于配置目的还是其他原因。我可能是错的,因为我是 Ubuntu 新手 但是您没有指定代码。我仍处于“搜索主题”阶段,而不是“阅读那些主题”,但据我所知,您总是使用-arch-code,其值可能相同。另外,请阅读您应该使用哪些其他选项以使它们可用(也许它们仅用于某些特殊的编译阶段?)。 【参考方案1】:

确保您使用的是正确版本的 nvcc。我遇到了这样的问题,这是因为我使用的是 NVCC 5.5 而不是 6.0。

还要确保破折号的符号正确:使用 - (0x2D) 而不是 - (0xD0)。

【讨论】:

它为我完成了这项工作!我从互联网上复制粘贴了一些东西以及 - 符号是如何混合的!

以上是关于“不知道如何处理' nvcc 致命错误的主要内容,如果未能解决你的问题,请参考以下文章