2016-01-31 194 views
0

我對CUDA有點新,所以請原諒我,如果這是一個愚蠢的問題。我一直在閱讀/觀看不少教程,但它們都很混亂,但我認爲我有一些基本想法。無論如何,我試圖做到以下幾點:我想初始化設備上的幾個常量變量(hbar,kb,q,T,me)。然後我想要有一個變量muB,它是這些其他初始化常量的函數。不過,我相信要這樣做,我需要先將常量值複製到主機內存,然後計算muB並將其傳遞迴設備內存。我試圖在主函數中做到這一點。CUDA - 使用__constant__變量和cudaMemcpyFromSymbol

#include <stdio.h> 
#include <stdlib.h> 
#include <cmath> 
#include <ctime> 

#include <cuda.h> 
#include <cuda_runtime.h> 

using namespace std; 

//Physical Constants 
__constant__ float hbar = 1.054e-34;     
__constant__ float kb = 1.38e-23;      
__constant__ float q = 1.6e-19;       
__constant__ float T = 300.0;       
__constant__ float me = 9.1e-31;       
__constant__ float muB = 0.0;       

int main() { 
    float tmp = 0.0f; 

    float h_q, h_hbar, h_me; 
    cudaMemcpyFromSymbol(&h_q, &q, sizeof(float)); 
    cudaMemcpyFromSymbol(&h_hbar, &hbar, sizeof(float)); 
    cudaMemcpyFromSymbol(&h_me, &me, sizeof(float)); 
    tmp = h_q*h_hbar/2/h_me; 
    cudaMemcpyToSymbol(&muB, &tmp, sizeof(float)); 

    return 0; 
} 

的問題是,當我運行這個程序,h_q,h_hbar和h_me都等於-107374176這是不是我初始化這些常量變量。 tmp也等於-53687088.0。我知道我一定在做錯事,但不知道是什麼。任何人有任何見解或建議?謝謝

回答

1

使用cudaMemcpyTo/FromSymbol時,我們直接使用符號名稱,而不是與&符號。因此,而不是這樣的:

cudaMemcpyFromSymbol(&h_q, &q, sizeof(float)); 
cudaMemcpyFromSymbol(&h_hbar, &hbar, sizeof(float)); 
cudaMemcpyFromSymbol(&h_me, &me, sizeof(float)); 
tmp = h_q*h_hbar/2/h_me; 
cudaMemcpyToSymbol(&muB, &tmp, sizeof(float)); 

做到這一點:

cudaMemcpyFromSymbol(&h_q, q, sizeof(float)); 
cudaMemcpyFromSymbol(&h_hbar, hbar, sizeof(float)); 
cudaMemcpyFromSymbol(&h_me, me, sizeof(float)); 
tmp = h_q*h_hbar/2/h_me; 
cudaMemcpyToSymbol(muB, &tmp, sizeof(float)); 

而且,我敢肯定,如果你做proper cuda error checking,每次你寫會引發錯誤的行。

+0

哦,我看到現在發生了什麼。我原本的格式是正確的。但是,我使用的是Visual Studio 2013,由於某些原因,編輯器在Memcpy函數內標記了q,hbar,me,muB變量名,並帶有錯誤警告:「錯誤:類型爲」float「的參數與類型參數不兼容「const void」「。當我將其改爲上述解決方案時,編輯沒有抱怨錯誤,我認爲該功能應該是這樣的。但是現在我運行你提供的代碼,我發現它編譯正確(儘管VSeditor仍然抱怨語法)。 – John

+1

是的,智能感知可能會引起誤解。 –

+0

您必須對這些事情非常有經驗,所以如果我可能會問一個問題,您是否在CUDA中編寫代碼時使用IDE,如果是這樣,您是否遇到編輯器將語法標記爲不正確的問題。例如,在VS2013中,第三個小於內核調用「<<<1,1> >>」的符號被標記爲不正確,但編譯得很好。對此有何想法? 無論如何非常感謝你的幫助,我真的很感激。 – John