[在多GPU环境中使用单个应用程序线程的CUDA 5.0上下文管理

问题描述 投票:0回答:1

似乎大多数来自Web的教程,指南,书籍和问答均涉及CUDA 3和4.x,所以这就是为什么我要特别询问CUDA 5.0的原因。对这个问题...

我想为具有两个CUDA设备的环境进行编程,但是仅使用一个线程来简化设计(特别是因为它是原型)。我想知道以下代码是否有效:

float *x[2];
float *dev_x[2];

for(int d = 0; d < 2; d++) {
    cudaSetDevice(d);
    cudaMalloc(&dev_x[d], 1024);
}

for(int repeats = 0; repeats < 100; repeats++) {
    for(int d = 0; d < 2; d++) {
        cudaSetDevice(d);
        cudaMemcpy(dev_x[d],x[d],1024,cudaMemcpyHostToDevice);

        some_kernel<<<...>>>(dev_x[d]);

        cudaMemcpy(x[d],dev_x[d],1024,cudaMemcpyDeviceToHost);
    }
    cudaStreamSynchronize(0);
}

我想特别知道即使在同一线程中发生cudaMalloc(...)交换时,测试之前的cudaSetDevice()是否仍然存在。另外,我想知道是否会发生与上下文相关的对象(例如cudaEvent_tcudaStream_t)相同的情况。

我之所以这样问,是因为我有一个这种风格的应用程序,不断出现一些映射错误,如果缺少一些内存泄漏或错误的API使用,我将找不到它。

注意:在我的原始代码中,我确实检查了每个CUDA调用。我没有将其放在此处以提高代码可读性。

c++ memory-management cuda multiple-gpu cuda-context
1个回答
1
投票

这只是错字吗?

for(int d = 0; d < 2; d++) {
    cudaSetDevice(0);  // shouldn't that be 'd'
    cudaMalloc(&dev_x, 1024);
}

请检查所有API调用的返回值!

© www.soinside.com 2019 - 2024. All rights reserved.