【问题标题】:CUDA curand "An illegal memory access was encountered"CUDA curand“遇到非法内存访问”
【发布时间】:2015-05-02 00:50:28
【问题描述】:

我花了很多时间试图找出这个问题的原因。以下代码尝试使用device 上的curand 生成一系列正态分布的随机变量。它似乎成功生成了一些,但随后因“遇到非法内存地址错误”而崩溃。非常感谢任何帮助。

main.cu

#include <stdio.h>
#include <cuda.h>
#include <curand_kernel.h>

class A {
public:

    __device__ A(const size_t& seed) {

        printf("\nA()"); 

        curandState state;

        curand_init(seed, 0, 0, &state);

        for(size_t i = 0; i < 1000; ++i)
            printf("\n%f", curand_normal(&state));

    }

    __device__ ~A() { printf("\n~A()"); }
};

/// Kernel
__global__ void kernel(const size_t& seed) {

    printf("\nHello from Kernel...");

    A a(seed);

    return;
}

int main(void) {


    kernel<<<1,1>>>(1);

    cudaError_t cudaerr = cudaDeviceSynchronize();
    if (cudaerr != CUDA_SUCCESS)
        printf("kernel launch failed with error \"%s\".\n",
               cudaGetErrorString(cudaerr));


    return 0;
}

输出

Hello from Kernel...
A()
0.292537
-0.718359
0.958011
0.633711kernel launch failed with error "an illegal memory access was encountered".

我已经在我的机器 (CUDA 7.0) 和一个超级计算集群 (CUDA 6.5) 上运行了这个程序,结果相同。

【问题讨论】:

    标签: c++ cuda


    【解决方案1】:

    摆脱内核参数的传递引用(&amp;)。

    你是not allowed to write GPU kernels that have pass-by-reference parameters。 GPU 内核无法修改主机变量。 (忽略统一内存、零拷贝和这里没有讨论的相关机制。)

    【讨论】:

      猜你喜欢
      • 2020-12-27
      • 2021-03-25
      • 2022-01-18
      • 2015-07-23
      • 2021-08-12
      • 1970-01-01
      • 2021-11-22
      • 2015-06-28
      • 2017-01-29
      相关资源
      最近更新 更多