【发布时间】:2017-09-07 16:28:08
【问题描述】:
我在其他地方读到 cudaMalloc 将跨内核同步。 (例如will cudaMalloc synchronize host and device?) 但是,我刚刚测试了这段代码,根据我在可视化分析器中看到的内容,cudaMalloc 似乎没有同步。如果您将 cudaFree 添加到循环中,则 会 同步。我正在使用 CUDA 7.5。有谁知道 cudaMalloc 是否改变了它的行为?还是我错过了一些微妙之处?非常感谢!
__global__ void slowKernel()
{
float input = 5;
for( int i = 0; i < 1000000; i++ ){
input = input * .9999999;
}
}
__global__ void fastKernel()
{
float input = 5;
for( int i = 0; i < 100000; i++ ){
input = input * .9999999;
}
}
void mallocSynchronize(){
cudaStream_t stream1, stream2;
cudaStreamCreate( &stream1 );
cudaStreamCreate( &stream2 );
slowKernel <<<1, 1, 0, stream1 >>>();
int *dev_a = 0;
for( int i = 0; i < 10; i++ ){
cudaMalloc( &dev_a, 4 * 1024 * 1024 );
fastKernel <<<1, 1, 0, stream2 >>>();
// cudaFree( dev_a ); // If you uncomment this, the second fastKernel launch will wait until slowKernel completes
}
}
【问题讨论】:
-
@RobertCrovella:在我正在测试的 Maxwell 设备上,看起来 cudaMalloc 不是同步调用。当我修复上述代码中内核中的明显缺陷并添加一些明智的 nanosleep 调用以稍微扩展配置文件时间线时,我看到 cudaMalloc 正在运行,而慢速和快速内核的两个实例都在 GPU 上处于活动状态。这可能是分析器问题,但在我看来并不像:pastebin.com/rC8XxKmT
-
我想我应该仔细看看。我也见证了。更让我好奇的是,如果我让两个内核都依赖于
dev_a,并且让两个内核都真正接触到dev_a中的全局内容,我仍然见证了前两个内核的重叠,与cudaMalloc之间的操作。我根本无法解释。
标签: cuda