【问题标题】:If I pass an array using pycuda to the GPU and then print it, why does it print zeros?如果我使用 pycuda 将数组传递给 GPU 然后打印它,为什么它打印零?
【发布时间】:2019-09-22 12:44:48
【问题描述】:

我正在尝试使用 pycuda 来加速我的神经网络(我知道 tensorflow 更容易用于 GPU 加速,我只是想先手动完成,因为我对神经网络比较陌生),但是每当我通过数组到 GPU 并让每个线程在 threadIdx 处打印出数组的值,即使我设置了数组值,它也会打印零。

我尝试使用一个非常简单的内核进行测试,它只打印一维数组的值,并且我尝试将数据类型更改为 float32。

我用于测试此问题的基本内核:

test_mod = SourceModule("""
    __global__ void test(float *a)
    {
        printf("%d: %d\\n", threadIdx.x, a[threadIdx.x]);
    }

    """)

我用来创建数组和初始化内核的python代码:

a = np.asarray([4,2,1])
a = a.astype(np.float32)
test_module = test_mod.get_function("test")
test_module(cuda.In(a), block=(3, 1, 1))

我希望它打印一些 4、2 和 1 的顺序,但每个线程都打印一个 0。

【问题讨论】:

  • %d 是正确的printf 格式说明符来打印float 数量吗?我不这么认为。我认为它应该是%f 或类似的东西。
  • 非常感谢!这让我永远卡住了

标签: python cuda pycuda


【解决方案1】:

问题在于内核中的打印语句。 %d 格式说明符用于整数。它不会正确格式化浮点值。要修复它,请像这样修改内核:

test_mod = SourceModule("""
    __global__ void test(float *a)
    {
        printf("%d: %f\\n", threadIdx.x, a[threadIdx.x]);
    }

    """)

[从 cmets 组装的答案并添加为社区 wiki 条目,以尝试将问题从 CUDA 标签的未回答队列中取出]。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    相关资源
    最近更新 更多