我试图将静态分配的__constant__变量作为内核参数进行传递,但似乎有些地方不对劲。内核的行为如同变量未初始化一样。但是,我仍然可以将变量作为全局变量进行访问(来自同一内核)。修改主机中的变量值是可行的,但同样,前提是我必须从全局作用域访问变量。下面是一个示例:
#include<cuda_runtime_api.h>
#include<cuda_runtime.h>
#include<stdio.h>
__constant__ float constant_a=1.12345;
__constant__ float constant_b;
__global__ void test_values(float a, float b) {
    printf("Device code: constant_a = %f, constant_b = %f\n", a, b);
    printf("Device code: constant_a = %f, constant_b = %f\n\n", constant_a, constant_b);
}
int main() {
    test_values<<<1, 1>>>(constant_a, constant_b);
    cudaDeviceSynchronize();
    const float h_const_a = 1;
    const float h_const_b = 2;
    cudaMemcpyToSymbol(constant_a, &h_const_a, sizeof(float));
    test_values<<<1, 1>>>(constant_a, constant_b);
    cudaDeviceSynchronize();
    cudaMemcpyToSymbol(constant_b, &h_const_b, sizeof(float));
    test_values<<<1, 1>>>(constant_b, constant_b);
    cudaDeviceSynchronize();
}内核打印出以下内容:
Device code: constant_a = 0.000000, constant_b = 0.000000
Device code: constant_a = 1.123450, constant_b = 0.000000
Device code: constant_a = 0.000000, constant_b = 0.000000
Device code: constant_a = 1.000000, constant_b = 0.000000
Device code: constant_a = 0.000000, constant_b = 0.000000
Device code: constant_a = 1.000000, constant_b = 2.000000如果有人能解释这一点,我也非常感谢您能提供我的信息来源。因为我没有在Nvidia指南或其他几本书中找到这些信息。
发布于 2020-04-01 15:15:36
我试图将静态分配的
__constant__变量作为内核参数传递,但似乎有些地方不对劲
问题是你不能这样做。它不受支持。
内核的行为如同变量未初始化一样
因为它们没有初始化。不能在宿主代码中访问__constant__变量,除非通过符号操作API。当您使用这些API时,您仅修改了设备内存中的值。没别的了。与静态声明的设备符号相关联的主机端变量仅作为用于绑定API调用的标签而存在。设备内存中的更改不会反映在主机内存中。唯一的例外是__managed__符号(在支持它的平台上)。
修改主机中的变量值有效,但同样,只有在访问全局范围中的变量时才有效
这是主机代码中__constant__变量唯一有效和受支持的用例。
,因为我在Nvidia指南或其他几本书中没有找到这个信息。
您没有找到有关如何执行此操作的信息,因为它不存在,也因为它不受支持。您可以找到here支持的内容的简明描述。
https://stackoverflow.com/questions/60959064
复制相似问题