【问题标题】:CUDA - Using __constant__ variables and cudaMemcpyFromSymbolCUDA - 使用 __constant__ 变量和 cudaMemcpyFromSymbol
【发布时间】:2016-01-31 13:31:47
【问题描述】:

我对 CUDA 有点陌生,所以如果这是一个愚蠢的问题,请原谅我。我一直在阅读/观看很多教程,但它们都非常令人困惑,但我认为我已经掌握了基本概念。无论如何,我正在尝试执行以下操作:我想在设备上初始化几个常量变量(hbar、kb、q、T、me)。然后我还想要一个变量 muB,它是这些其他初始化常量的函数。但是,我相信要做到这一点,我需要首先将常量值复制到主机内存,计算 muB 并将其传回设备内存。我尝试在主要功能中执行此操作。

#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。我知道我一定做错了什么,但不能完全弄清楚是什么。任何人有任何见解或建议?谢谢

【问题讨论】:

    标签: c++ cuda


    【解决方案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,你写的每一行都会抛出一个错误。

    【讨论】:

    • 哦,我知道现在发生了什么。我最初的格式是正确的。但是,我使用的是 Visual Studio 2013,出于某种原因,编辑器在 Memcpy 函数中标记了 q、hbar、me、muB 变量名称,并带有错误警告:“错误:类型为“float”的参数与类型的参数不兼容“常量无效”“。当我将其更改为上面的解决方案时,编辑器并没有抱怨错误,我认为该功能应该是这样的。但是,现在我运行您提供的代码,我看到它编译正确(尽管 VSeditor 仍在抱怨语法)。
    • 是的,智能感知可能会产生误导。
    • 您必须对这些事情非常有经验,所以如果我可能会问一个问题,您在 CUDA 中编码时是否使用 IDE,如果是,您是否遇到编辑器将语法标记为不正确的问题。例如,在 VS2013 中,内核调用“>>”的第三个小于符号被标记为不正确,但编译得很好。对此有什么想法吗?无论如何,非常感谢您的帮助,我真的很感激。
    • 启动配置的语法&lt;&lt;&lt;&gt;&gt;&gt; 是 C++ 的 CUDA 扩展,因此对于任何“知道”C/C++ 语法的 IDE 来说,它看起来都是语法错误。我个人不使用任何 IDE,它们往往会妨碍我。
    • 我一般不使用 IDE。正如@njuffa 已经指出的那样,您指出的语法是特定于 CUDA 的,因此很可能会抛弃任何“普通”解析器。如果你在这个页面的右上角搜索“cuda red underline”,你会发现很多关于这个问题的讨论,也许有一些方法可以缓解它。 YMMV。就我个人而言,我会忽略它,因为我不依赖 IDE 来告诉我我的 CUDA 语法是否正确,并且智能感知/红色下划线绝不会影响您编写和编译正确代码的能力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多