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。我知道我一定在做錯事,但不知道是什麼。任何人有任何見解或建議?謝謝
哦,我看到現在發生了什麼。我原本的格式是正確的。但是,我使用的是Visual Studio 2013,由於某些原因,編輯器在Memcpy函數內標記了q,hbar,me,muB變量名,並帶有錯誤警告:「錯誤:類型爲」float「的參數與類型參數不兼容「const void」「。當我將其改爲上述解決方案時,編輯沒有抱怨錯誤,我認爲該功能應該是這樣的。但是現在我運行你提供的代碼,我發現它編譯正確(儘管VSeditor仍然抱怨語法)。 – John
是的,智能感知可能會引起誤解。 –
您必須對這些事情非常有經驗,所以如果我可能會問一個問題,您是否在CUDA中編寫代碼時使用IDE,如果是這樣,您是否遇到編輯器將語法標記爲不正確的問題。例如,在VS2013中,第三個小於內核調用「<<<1,1> >>」的符號被標記爲不正確,但編譯得很好。對此有何想法? 無論如何非常感謝你的幫助,我真的很感激。 – John