【问题标题】:Strange CUDA behavior in vector multiplication program向量乘法程序中奇怪的 CUDA 行为
【发布时间】:2010-07-02 20:00:46
【问题描述】:

我在使用一个非常基本的 CUDA 程序时遇到了一些问题。我有一个程序,它将主机和设备上的两个向量相乘,然后比较它们。这没有问题。问题是我正在尝试测试不同数量的线程和块以用于学习目的。我有以下内核:

__global__ void multiplyVectorsCUDA(float *a,float *b, float *c, int N){
    int idx = threadIdx.x;
    if (idx<N) 
        c[idx] = a[idx]*b[idx];
}

我称之为:

multiplyVectorsCUDA <<<nBlocks, nThreads>>> (vector_a_d,vector_b_d,vector_c_d,N);

目前我已将 nBLocks 固定为 1,因此我只改变矢量大小 N 和线程数 nThreads。据我了解,每次乘法都会有一个线程,所以NnThreads 应该相等。

问题如下

  1. 我首先用N=16nThreads&lt;16 调用内核,这不起作用。 (没关系)
  2. 然后我用N=16nThreads=16 调用它,效果很好。 (再次 按预期工作)
  3. 但是当我用 N=16nThreads&lt;16 调用它时,它仍然有效!

我不明白为什么最后一步不像第一步那样失败。如果我重新启动我的电脑,它只会再次失败。

以前有没有人遇到过这样的事情或者可以解释这种行为?

【问题讨论】:

    标签: vector cuda multiplication


    【解决方案1】:

    等等,你是在连续呼叫三个人吗?我不知道您的其余代码,但是您确定要清除每次运行之间分配的图形内存吗?如果不是,这可以解释为什么它第一次不工作,但当你传递相同的值时第三次工作,以及为什么它只能在重新启动后再次工作(重新启动会清除所有分配的内存)。

    【讨论】:

    • 是的,我连续调用三个,但是针对程序的不同实例。是的,我正在释放内存: cudaMalloc((void **) &vector_a_d, vector_size) 在程序结束时分配和 freeCUDA(vector_a_d) 。注意:起初我也认为这是问题,所以我仔细检查了内存正在被释放
    • 嗯。老实说,我已经有几个月没有接触过 CUDA 了。我在家里确实有一些笔记,但我在使用它时遇到了一些问题。等我回家后我会检查这些。抱歉,我现在无法提供更多帮助。
    • 嘿,没关系。感谢您的回答。我会继续尝试并在 CUDA 论坛中询问我是否幸运。
    【解决方案2】:

    不知道是否可以回答我自己的问题,但我意识到在比较主机和设备向量时我的代码中有一个错误(该部分代码未发布)。带来不便敬请谅解。有人可以关闭这个帖子,因为它不会让我删除它吗?

    【讨论】:

    • 只要将此回复标记为答案即可关闭。
    猜你喜欢
    • 2015-08-12
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2021-06-26
    • 2013-08-02
    相关资源
    最近更新 更多