我在尝试创建 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);
}
发布的代码还有其他各种问题:
- 它没有为
m
提供定义或n
. - 内核调用语法错误,而不是
<<...>>
应该是<<<...>>>
对于这些类型的基本问题,最好研究像 vectorAdd
这样的简单(正确)代码示例代码。
关于c++ - 预期的 ;在 CUDA 内核上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49338931/