我对CUDA有点新意,所以如果这是一个愚蠢的问题,请原谅我。我一直在阅读/观看相当多的教程,但它们都非常混乱,但我认为我有基本的想法。无论如何,我试图做以下事情:我想在设备上初始化几个常量变量(hbar,kb,q,T,me)。然后我想要一个变量muB,它是这些其他初始化常量的函数。但是,我相信这样做,我需要先将常量值复制到主机内存,计算muB并将其传递回设备内存。我试图在main函数中执行此操作。
#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。我知道我一定做错了什么但不能弄明白什么。有人有任何见解或建议吗?感谢
答案 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,那么你编写的每一行都会引发错误。