【问题标题】:cudaThreadSynchronise() returned error code 6cudaThreadSynchronise() 返回错误代码 6
【发布时间】:2017-01-23 18:33:22
【问题描述】:

我正在尝试运行代码以使用 Cuda 中的并行缩减来查找数组的最大元素

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>
/* a is the array that holds the values and c is the array used to store the maximum in a block */ 
cudaError_t reduce_max(int *a,int *c,int size);

/*The kernel that performs the reduction */
__global__ void global_max(int *d_c, int * d_a)
{
    int myId=threadIdx.x+blockDim.x*blockIdx.x;
    int tid=threadIdx.x;
    for(int s=(blockDim.x)/2; s>0; s>>1)
    {
        if(tid<s)
        {
            d_a[myId]=max(d_a[myId],d_a[myId+s]);
        }
        __syncthreads();
    }
    if(tid==0)
    {
        d_c[blockIdx.x]=d_a[myId];
    }
}

int main()
{
    const int arraySize = 1024;
    int i;
    int a[arraySize];
    for(i=0;i<arraySize;i++)
    {
        a[i]=i;
    }
    int c[arraySize];
    cudaError_t cudaStatus = reduce_max(a,c,arraySize);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "The required operation failed");
        return 1;
    }
    cudaStatus = cudaThreadExit();
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaThreadExit failed!");
        return 1;
    }

    return 0;
}

// Helper function for using CUDA to add vectors in parallel.
cudaError_t reduce_max(int *a,int *c,int size)
{
    int *dev_a = 0;
    int *dev_c = 0;
    /*
    dev_a and dev_c are the arrays on the device 
    */
    cudaError_t cudaStatus;
    const dim3 blockSize(64,1,1);
    const dim3 gridSize(size/blockSize.x,1,1);

    // Choose which GPU to run on, change this on a multi-GPU system.
    cudaStatus = cudaSetDevice(0);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaSetDevice failed!  Do you have a CUDA-capable GPU installed?");
        goto Error;
    }

    /*Allocating the memory on the device */
    cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaMalloc failed!");
        goto Error;
    }

    cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaMalloc failed!");
        goto Error;
    }

    /*Copying array from host to device */
    cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaMemcpy failed!");
        goto Error;
    }

    /*Calling the kernel */
   global_max<<<gridSize,blockSize>>>(dev_c, dev_a);

    cudaStatus = cudaThreadSynchronize();
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaThreadSynchronize returned error code %d\n", cudaStatus);
        goto Error;
    }

    // Copy output vector from GPU buffer to host memory.
    cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaMemcpy failed!");
        goto Error;
    }

Error:
    cudaFree(dev_c);
    cudaFree(dev_a);   
    return cudaStatus;
}

但是在执行上述代码时,我得到了错误: cudaThreadSynchronize 返回错误码 6。

我无法找出问题所在。

【问题讨论】:

  • 错误代码 6 并不能说明太多。通过解析器 (cudaGetErrorString) 传递错误代码,您可能可以获得更多有用的信息,如 here 所示。您还可以使用cuda-memcheck 运行您的代码,这可能会提供更多有用的信息。
  • 在使用 cudaGetErrorString 时我得到:(cudaThreadSynchronize 返回错误代码启动超时并被终止)

标签: multithreading parallel-processing cuda reduction


【解决方案1】:

您的代码将永远运行。结果你遇到了超时。

这条线被破坏了,你的编译器应该会抛出一个警告:

for(int s=(blockDim.x)/2; s>0; s>>1)

s&gt;&gt;1 不会修改 s 变量。我很确定你的意思是s&gt;&gt;=1,它修改了s。如果不修改 s,您的循环将永远运行,因此您会遇到内核超时。

改为这样做:

for(int s=(blockDim.x)/2; s>0; s>>=1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2014-07-03
    • 1970-01-01
    • 2017-06-03
    相关资源
    最近更新 更多