c++ - 预期的 ;在 CUDA 内核上

标签 c++ cuda

我在尝试创建 CUDA 内核以执行 for 循环时遇到一个非常奇怪的错误:

#include <stdlib.h>
#include <stdio.h>
#include <thrust/reduce.h>
#include <cuda.h>


int main(int argc, char** argv)
{
    float *arrayA;
    cudaMalloc((void**)&arrayA, 4096 * 4096 * sizeof(float));
    float *arrayB;
    cudaMalloc((void**)&arrayB, 4096 * 4096 * sizeof(float));
    __global__ void loopKernel(float* arrayA, float* arrayB)
    {
        int i = threadIdx.x + blockDim.x*blockIdx.x;
        if (i < m)
        {
            //do stuf
        }
    }
    loopKernel << 8, 256 >> (arrayA, arrayB);
}

错误出现在内核的开头 {(第 14 行):

error: expected a ";"

这似乎很奇怪,因为我在 Visual Studio 和 linux 终端上遇到了同样的错误,所以这不是操作系统问题。 该文件也是 .cu,所以它不可能被发送到错误的编译器。 任何帮助将不胜感激。

最佳答案

A __global__函数定义(即内核定义)不是你在另一个函数体内做的事情。我们通常不会在 C 或 C++ 中执行此操作(C/C++ 函数定义通常不会放在另一个函数定义的主体中)。

将您的内核定义放在全局范围内(即在任何其他函数定义的主体之外,包括 main)。

像这样:

#include <stdlib.h>
#include <stdio.h>
#include <thrust/reduce.h>
#include <cuda.h>


__global__ void loopKernel(float* arrayA, float* arrayB)
{
        int i = threadIdx.x + blockDim.x*blockIdx.x;
        if (i < m)
        {
            arrayA[i] = 0.f; 
            arrayB[(n - 1)*m + i] = 0.f;
        }
}

int main(int argc, char** argv)
{
    float *arrayA;
    cudaMalloc((void**)&arrayA, 4096 * 4096 * sizeof(float));
    float *arrayB;
    cudaMalloc((void**)&arrayB, 4096 * 4096 * sizeof(float));

    loopKernel << 8, 256 >> (arrayA, arrayB);
}

发布的代码还有其他各种问题:

  1. 它没有为 m 提供定义或 n .
  2. 内核调用语法错误,而不是<<...>>应该是<<<...>>>

对于这些类型的基本问题,最好研究像 vectorAdd 这样的简单(正确)代码示例代码。

关于c++ - 预期的 ;在 CUDA 内核上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49338931/

相关文章:

Cuda - nvcc - 没有可在设备上执行的内核镜像。问题是什么?

directx - 我应该立即创建 CUDA 应用程序,还是等待 DirectX 11?

c++ - C++模板类基于主函数的调用来打印字符串或int输出

c++ - 带unsigned int的字节数组的求余算法

c++ - Berkeley DB,多线程 fatal error

cuda - NPP 库函数参数 *pDeviceBuffer

cuda - 动态检测启用 CUDA 的 NVIDIA 卡,然后才初始化 CUDA 运行时 : How to do?

c++ - 是否可以概括一个将 STL 容器作为参数的函数?

c++ - try/catch block 失败并且应用程序崩溃

cuda - cuda内核中的函数