2016-06-11 61 views
-3

我有一個大小爲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)')。爲什麼要這麼做? –

回答

1

至少你感到困惑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; 

以及一些其他行。