预期;在CUDA内核上

时间:2018-03-17 16:02:10

标签: c++ cuda

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

$1+1$

错误发生在开头{对于内核(第14行):

#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);
}
因为我在Visual Studio和linux终端上遇到同样的错误,所以它似乎很奇怪,所以它不是操作系统问题。 该文件也是.cu,因此无法将其发送到错误的编译器。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

__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. 它未提供mn
  2. 的定义
  3. 内核调用语法错误,而不是<<...>>它应该是<<<...>>>
  4. 对于这些类型的基本问题,研究像vectorAdd示例代码这样的简单(正确)代码可能更好。