我正在尝试编译一个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(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;
}
我认为它可能是编译器,但您认为它会是什么?
答案 0 :(得分:4)
我想如果你做出这些改变:
__global__ void operate(int* memoria1, int* memoria2)
^ ^
和
cudaMalloc((void**) &memory_1, 5 * sizeof(int));
cudaMalloc((void**) &memory_2, 5 * sizeof(int));
^ ^
您的代码将编译并正常运行。
由于代码实际上没有初始化CUDA内核正在操作的a
和c
的值,因此您的结果会有点奇怪。所以你可能想要初始化它们。
答案 1 :(得分:0)
TL:DR 您的内核声明位于错误的位置,编译器将其视为变量。您需要确保您的内核声明位于使用它的 .cu 文件中。如果它需要首先在使用它的文件中声明,但只是在声明点乱搞,则不是 100。
我的 cuda 代码也遇到了同样的问题。 问题是我在错误的地方声明了我的内核。我会详细说明
我的主要文件有一个名为 host.h 的头文件,我在其中保留了我正在使用的所有头文件以及我的项目方法的声明。在这里,我还添加了 cuda 运行时的头文件以及我在其中声明内核的 device.h 文件。
看起来像这样:
host.h
<块引用>#include "iostream" #include "iomanip"
#include "device.h"
设备.h
<块引用>全局 myCudeKernel();
好吧,这由于某种原因导致了问题。最终将 device.h 标头移动到使用它的主文件中,没有问题。