我在使用非常基本的 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
。据我了解,每次乘法都会有一个线程,因此N
应该nThreads
相等。
问题如下
- 我首先用它调用内核,
N=16
它nThreads<16
不起作用。(还行吧) - 然后我用它来调用它,
N=16
它nThreads=16
工作正常。(再次按预期工作) - 但是当我调用它时
N=16
它nThreads<16
仍然有效!
我不明白为什么最后一步不像第一步那样失败。如果我重新启动我的电脑,它只会再次失败。
有没有人遇到过这样的事情或者可以解释这种行为?