最大值调用cuda中的功能设备

时间:2013-09-20 13:09:13

标签: cuda

我正在尝试在全局功能上调用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;
}

1 个答案:

答案 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运行您的应用,它还会检查各种错误。