在尝试创建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,因此无法将其发送到错误的编译器。
任何帮助将不胜感激。
答案 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);
}
发布的代码存在各种其他问题:
m
或n
。<<...>>
它应该是<<<...>>>
对于这些类型的基本问题,研究像vectorAdd
示例代码这样的简单(正确)代码可能更好。