如果我将使用pycuda的数组传递给GPU,然后进行打印,为什么它会打印零?

时间:2019-05-04 01:41:30

标签: python cuda pycuda

我正在尝试使用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。

1 个答案:

答案 0 :(得分:1)

问题出在内核中的print语句。 %d格式说明符用于整数。它不会正确格式化浮点值。要对其进行修复,请按如下所示修改内核:

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

    """)

[答案由评论汇总而成,并作为社区Wiki条目添加,以尝试从CUDA标签的未确定队列中解决问题]。