【发布时间】:2017-11-15 07:45:07
【问题描述】:
代码:
__global__ void K1() {
int p=1;
for(int i=0; i<100000; ++i)
for(int j=0; j<100000; ++j)
p*=(i+100)*j;
printf("K1\n");
}
__global__ void K2() {
printf("K2\n");
}
int main() {
int *ptr;
cudaStream_t s1, s2;
cudaStreamCreate(&s1);
cudaStreamCreate(&s2);
K1<<<1, 1, 0, s1>>>();
cudaHostAlloc(&ptr, 1, 0);
K2<<<1, 1, 0, s2>>>();
cudaDeviceSynchronize();
return 0;
}
输出:
K2
K1
问题:
-
s1是否与默认流相同? - 据此documentation,
如果主机线程在它们之间发出以下任一操作,则来自不同流的两个命令不能同时运行:
- 页面锁定的主机内存分配,
K2 不应该在K1 完成之后开始吗?
【问题讨论】:
-
据此:docs.nvidia.com/cuda/cuda-c-programming-guide/…,要点 1,K1 不应该在 K2 开始之前完成吗?
-
我已经根据我的新理解修改了问题。
-
如果你正在编译一个非调试版本,那么 K1 中的循环将被编译器优化掉。由于多种原因,我认为您的示例无效。
-
@talonmies,这些循环只是为了模拟
K1在时间方面很长的情况。 -
但这不会是因为编译器只会删除它们