在CUDA分配中的SIGSEGV

问题描述:

我有一个大小为spectrum_sizeuint64_t的主机阵列,我需要分配并将其复制到我的GPU上。 但是,当我试图在GPU内存中分配这个,但我继续收到SIGSEGV ...任何想法?在CUDA分配中的SIGSEGV

uint64_t * gpu_hashed_spectrum; 
    uint64_t * gpu_hashed_spectrum_h = new uint64_t [spectrum_size]; 
    HANDLE_ERROR(cudaMalloc((void **)&gpu_hashed_spectrum, sizeof(uint64_t *) * spectrum_size)); 
    for(i=0; i<spectrum_size; i++) { 
     HANDLE_ERROR(cudaMalloc((void **)&gpu_hashed_spectrum_h[i], sizeof(uint64_t))); 
    } 
    printf("\t\t...Copying\n"); 
    for(i=0; i<spectrum_size; i++) { 
     HANDLE_ERROR(cudaMemcpy((void *)gpu_hashed_spectrum_h[i], (const void *)hashed_spectrum[i], sizeof(uint64_t), cudaMemcpyHostToDevice)); 
    } 
    HANDLE_ERROR(cudaMemcpy(gpu_hashed_spectrum, gpu_hashed_spectrum_h, spectrum_size * sizeof(uint64_t *), cudaMemcpyHostToDevice)); 

的完整代码可以here

UPDATE:

我想用这种方式做,诺伊我有SIGSEGV的代码的其他部分(在内核中,使用这种阵列时也许是由于其他错误。

uint64_t * gpu_hashed_spectrum; 
    HANDLE_ERROR(cudaMalloc((void **)&gpu_hashed_spectrum, sizeof(uint64_t) * spectrum_size)); 
    HANDLE_ERROR(cudaMemcpy(gpu_hashed_spectrum, hashed_spectrum, spectrum_size * sizeof(uint64_t), cudaMemcpyHostToDevice)); 
+0

说真的,我给了你一个完整的工作示例,说明如何在回答最后一个问题时做到这一点。给我一个很好的理由,为什么我应该把它作为你昨天的问题的一个重复来解决? – talonmies

+0

这不是同一个问题,昨天的例子实际上运行良好,这里的问题不在配置中,但事实上,这使得一个SIGSEGV ......我不太了解......我很抱歉...我在昨天的例子 – Cordaz

+0

的想法做了这个,我什至不知道你想做什么。这似乎很清楚你打算'gpu_hashed_spectrum'是一个指针指针,因为你正在为'uint64_t *'分配空间(这看起来好像你正在尝试做一个深层拷贝......)但为什么你将它声明为单个指针?你实际上是在尝试做一个深层复制,其中每个指针只指向*一个*数据项,就像循环的'cudaMemcpy'操作所暗示的那样('sizeof(uint64_t)')。为什么要这么做? –

至少你感到困惑uint64_t**unit64_t*

在第1行中,将定义gpu_hashed_spectrum作为指针,指向型unit64_t的一些数据,但在第3行

HANDLE_ERROR(cudaMalloc((void **)&gpu_hashed_spectrum, sizeof(uint64_t *) * spectrum_size)); 

使用gpu_hashed_spectrum作为一个指针,指向型unit64_t*的一些数据。

也许你应该你的定义修改为

uint64_t** gpu_hashed_spectrum; 

以及一些其他行。