编译CUDA时出错
我试图编译一个C程序来尝试并行编程,当我试图用nvcc编译器(Nvidia)编译它时,它会给我以下错误:编译CUDA时出错,c,gcc,compiler-construction,cuda,nvcc,C,Gcc,Compiler Construction,Cuda,Nvcc,我试图编译一个C程序来尝试并行编程,当我试图用nvcc编译器(Nvidia)编译它时,它会给我以下错误: inicis.cu(3): error: attribute "global" does not apply here inicis.cu(3): error: incomplete type is not allowed inicis.cu(3): error: identifier "a" is undefined inicis.cu(3): error: expected a "
inicis.cu(3): error: attribute "global" does not apply here
inicis.cu(3): error: incomplete type is not allowed
inicis.cu(3): error: identifier "a" is undefined
inicis.cu(3): error: expected a ")"
inicis.cu(4): error: expected a ";"
/usr/include/_locale.h(68): error: expected a declaration
inicis.cu(20): error: type name is not allowed
inicis.cu(21): error: type name is not allowed
inicis.cu(22): error: type name is not allowed
inicis.cu(41): error: identifier "dev_a" is undefined
inicis.cu(42): error: identifier "dev_b" is undefined
inicis.cu(43): error: identifier "dev_c" is undefined
似乎nvcc不认识Nvidia制作的全局属性
这是我的C程序,非常简单:
__global__ void operate(*memoria1, *memoria2)
{
memoria2[threadIdx.x] = memoria1[threadIdx.x] + 1;
}
int main(int args, char **argv){
int a[5], c[5];
int *memory_1, *memory_2;
cudaMalloc(void** &memory_1, 5 * sizeof(int));
cudaMalloc(void** &memory_2, 5 * sizeof(int));
cudaMemcpy(memory_1, a, 5 * sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(memory_2, c, 5 * sizeof(int), cudaMemcpyHostToDevice);
operate <<<1, 5>>>(memory_1, memory_2);
cudaMemcpy(c, memory_2, 5 * sizeof(int), cudaMemcpyDeviceToHost);
for (int i = 0; i < sizeof(c); ++i)
{
printf ("%d" , c[i]);
}
cudaFree(memory_1);
cudaFree(memory_2);
return 0;
}
\uuuuu全局\uuuuuuu无效操作(*内存1,*内存2)
{
memoria2[threadIdx.x]=memoria1[threadIdx.x]+1;
}
int main(int参数,字符**argv){
int a[5],c[5];
int*memory_1,*memory_2;
cudamaloc(void**&memory_1,5*sizeof(int));
cudamaloc(void**&memory_2,5*sizeof(int));
cudaMemcpy(内存1,a,5*sizeof(int),cudamemcpyhostodevice);
cudaMemcpy(内存2,c,5*sizeof(int),cudamemcpyhostodevice);
操作(存储器1、存储器2);
cudaMemcpy(c,内存2,5*sizeof(int),cudaMemcpyDeviceToHost);
对于(int i=0;i
我认为可能是编译器,但您认为会是什么?我认为如果您进行以下更改:
__global__ void operate(int* memoria1, int* memoria2)
^ ^
以及:
您的代码将正确编译和运行。
您的结果会有点奇怪,因为代码实际上并没有初始化CUDA内核正在操作的
a
和c
的值。因此,您可能需要初始化它们。我认为如果您进行以下更改:
__global__ void operate(int* memoria1, int* memoria2)
^ ^
以及:
您的代码将正确编译和运行。
您的结果会有点奇怪,因为代码实际上并没有初始化CUDA内核正在操作的a
和c
的值。因此,您可能需要初始化它们。TL:DR
内核声明位于错误的位置,编译器将其视为变量。您需要确保内核声明位于使用它的.cu文件中。如果它需要首先在使用它的文件中声明,而只是乱弄它的声明点,则不是100
我的cuda代码也有同样的问题。
问题是我在错误的地方声明了我的内核。我会详细说明的
我的main有一个名为host.h的头文件,其中保存了我使用的所有头文件以及我的项目方法声明。在这里,我还添加了cuda运行时的头文件以及声明内核的device.h文件
看起来像这样:
主持人:h
#包括“iostream”
#包括“iomanip”
#包括“device.h”
设备.h
globalmyCudeKernel()
这是因为某种原因造成的问题。最终将device.h头移动到使用它的主文件,没有问题。TL:DR
内核声明位于错误的位置,编译器将其视为变量。您需要确保内核声明位于使用它的.cu文件中。如果它需要首先在使用它的文件中声明,而只是乱弄它的声明点,则不是100
我的cuda代码也有同样的问题。
问题是我在错误的地方声明了我的内核。我会详细说明的
我的main有一个名为host.h的头文件,其中保存了我使用的所有头文件以及我的项目方法声明。在这里,我还添加了cuda运行时的头文件以及声明内核的device.h文件
看起来像这样:
主持人:h
#包括“iostream”
#包括“iomanip”
#包括“device.h”
设备.h
globalmyCudeKernel()
这是因为某种原因造成的问题。最终将device.h头移动到使用它的主文件,没有问题。@talonmies谢谢!我没有你聪明。我从一个网站示例中复制了内核。但是非常感谢!;)@塔龙,谢谢!我没有你聪明。我从一个网站示例中复制了内核。但是非常感谢!;)