CUDA - 使用__constant__变量和cudaMemcpyFromSymbol

时间:2016-01-31 05:03:27

标签: c++ cuda

我对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。我知道我一定做错了什么但不能弄明白什么。有人有任何见解或建议吗?感谢

1 个答案:

答案 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,那么你编写的每一行都会引发错误。