我正在尝试在全局功能上调用1000000或更多时间设备功能。但是,我总是有以下错误: Microsoft C ++异常:cudaError_enum在内存位置0x0031fc24 但代码很简单。从线程设备到线程主机的执行线程是否可能异步锁定某些资源?正如我们所看到的那样,变量没有溢出,所以发生了什么?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include "cuda.h"
#include "curand_kernel.h"
#define NDIM 30
#define NPAR 3
#define DIMPAR NDIM*NPAR //
__device__ float f(float *inputs){
float t = 0.0;
int i;
for(i = 0 ; i < 15; i++)
t+= inputs[i]*0.0001;
return t;
}
__global__ void kernel(float *pos, float *pbest){
int thread = threadIdx.x + blockDim.x * blockIdx.x;
int i = 0;
float tpbest = 0.0;
if(thread < DIMPAR){
do{
tpbest = f(pbest);
i++;
}while(i < 1000000); //max length int 2147483648 > 1000000
}
}
int main(int argc, char *argv[])
{
float *d_pos, *h_pos;
float *d_pbest, *h_pbest;
h_pos = ( float *) malloc(sizeof( float ) * DIMPAR);
h_pbest = ( float *) malloc(sizeof( float ) * DIMPAR);
cudaMalloc((void**)&d_pos, DIMPAR * sizeof( float ));
cudaMalloc((void**)&d_pbest, DIMPAR * sizeof( float ));
int i, numthreadsperblock, numblocks;
numthreadsperblock = 512;
numblocks = (DIMPAR / numthreadsperblock) + ((DIMPAR % numthreadsperblock)?1:0);
printf("numthreadsperblock: %i;; numblocks:%i\n", numthreadsperblock, numblocks);
//fill in host code
for(i = 0 ; i < DIMPAR ; i++){
h_pos[i] = 1;
h_pbest[i] = 1;
}
//transf. to device memory
cudaMemcpy(d_pos, h_pos, DIMPAR * sizeof( float ), cudaMemcpyHostToDevice);
cudaMemcpy(d_pbest, h_pbest, DIMPAR * sizeof( float ), cudaMemcpyHostToDevice);
kernel<<<numblocks,numthreadsperblock>>>(d_pos, d_pbest);
cudaMemcpy(h_pos, d_pos, DIMPAR * sizeof( float ), cudaMemcpyDeviceToHost);
return 0;
}
答案 0 :(得分:1)
我怀疑完整的错误消息是这样的:
First-chance exception at 0x7c812a5b in myapp.exe: Microsoft C++ exception: cudaError_enum at memory location 0x0031fc24...
您应该在CUDA代码中执行适当的cuda error checking(但我运行了您的代码并且没有看到任何明显的API错误。)
如果您没有通过上述方法报告CUDA错误(正确的CUDA错误检查),那么您可以安全地忽略此错误。它是由在您的代码链接的CUDA库中被捕获并正确处理的异常引起的。
您的应用程序仍然可以正常运行,如果您在Visual Studio之外运行可执行文件,我相信您不会看到此消息。
您可以尝试更新到CUDA 5.5以查看此特定消息是否消失。
作为另一个指标,您可以使用cuda-memcheck
运行您的应用,它还会检查各种错误。