c++ 编译Cuda时出错-应为主表达式

falq053o  于 2023-04-01  发布在  其他
关注(0)|答案(5)|浏览(237)

这个程序看起来很好,但我还是有错误,有什么建议吗?
程序:

#include "dot.h"
#include <cuda.h>
#include <cuda_runtime.h>
#include <stdio.h>

int main(int argc, char** argv)
{
    int *a, *b, *c;
    int *dev_a, *dev_b, *dev_c;
    int size = N * sizeof(int);

    cudaMalloc((void**)&dev_a, size);
    cudaMalloc((void**)&dev_b, size);
    cudaMalloc((void**)&dev_c, sizeof(int));

    a = (int *)malloc (size);
    b = (int *)malloc (size);
    c = (int *)malloc (sizeof(int));

    random_ints(a, N);
    random_ints(b, N);

    cudaMemcpy(dev_a, a, size, cudaMemcpyHostToDevice);
    cudaMemcpy(dev_b, b, size, cudaMemcpyHostToDevice);

    int res = N/THREADS_PER_BLOCK;
    dot<<< res, THREADS_PER_BLOCK >>> (dev_a, dev_b, dev_c);
    //helloWorld<<< dimGrid, dimBlock >>>(d_str);

    cudaMemcpy (c, dev_c, sizeof(int), cudaMemcpyDeviceToHost);

    free(a); free(b); free(c);
    cudaFree(dev_a);
    cudaFree(dev_b);
    cudaFree(dev_c);
    return 0;
}

错误:
DotProductCuda.cpp:27:错误:'<'标记之前需要主表达式
DotProductCuda.cpp:27:错误:'>'标记之前需要主表达式

3xiyfsfu

3xiyfsfu1#

调用内核的<<< >>>语法不是标准的C或C++。这些调用必须在NVCC编译器编译的文件中。这些文件通常以.cu扩展名命名。对CUDA的其他API调用(如cudaMalloc)可以在常规的.c或.cpp文件中。

cvxl0en2

cvxl0en22#

nvcc使用文件扩展名来确定如何处理文件的内容。如果文件中有CUDA语法,则它必须具有.cu扩展名,否则nvcc将直接将文件原封不动地传递给主机编译器,从而导致您观察到的语法错误。

ndasle7k

ndasle7k3#

编译器似乎无法识别〈〈,〉〉〉语法。我没有CUDA的经验,但我猜你需要用特殊的编译器编译这个文件,而不是普通的C编译器。

gpnt7bae

gpnt7bae4#

我发现你所有的代码都必须进入main方法,所以你必须在那里硬编码所有内容,我猜这是一个线程问题,他们希望你所有的代码都在他们的线程上运行。

1sbrub3j

1sbrub3j5#

也许你在内核中使用了一个宿主函数(例如printf)?

相关问题