Asynchronous 将CUDA回调的异步副本排入队列-不允许?

Asynchronous 将CUDA回调的异步副本排入队列-不允许?,asynchronous,cuda,cuda-streams,Asynchronous,Cuda,Cuda Streams,该计划: #include <string> #include <stdexcept> struct buffers_t { void* host_buffer; void* device_buffer; }; void ensure_no_error(std::string message) { auto status = cudaGetLastError(); if (status != cudaSuccess) {

该计划:

#include <string>
#include <stdexcept>

struct buffers_t {
    void* host_buffer;
    void* device_buffer;
};

void ensure_no_error(std::string message) {
    auto status = cudaGetLastError();
    if (status != cudaSuccess) {
        throw std::runtime_error(message + ": " + cudaGetErrorString(status));
    }
}

void my_callback(cudaStream_t stream, cudaError_t status, void* args) {
    auto buffers = (buffers_t *) args;
    cudaMemcpyAsync(
        buffers->host_buffer, buffers->device_buffer,
        1, cudaMemcpyDefault, stream);
    ensure_no_error("after cudaMemcpyAsync");
}

int main() {
    cudaStream_t stream;
    cudaStreamCreateWithFlags(&stream, cudaStreamNonBlocking);
    buffers_t buffers;
    cudaMallocHost(&buffers.host_buffer, 1);
    cudaMalloc(&buffers.device_buffer, 1);
    cudaStreamAddCallback(stream, my_callback, &buffers, 0);
    ensure_no_error("after enqueue callback");
    cudaStreamSynchronize(stream);
    ensure_no_error("after sync");
}
这有点奇怪,因为
cudaMemcpyAsync
的API引用没有将
cudaerrornotallowed
列为潜在错误之一。从回调调度异步复制是否真的有问题

注意:我的机器有GTX650TI(CC3.0)、CUDA9.0、Linux内核4.8.0、驱动程序384.59

从回调调度异步复制是否真的有问题

从流上回调:

回调不能(直接或间接地)进行CUDA API调用,因为如果进行这样的调用导致死锁,它可能会自行等待

从回调调度异步复制是否真的有问题

从流上回调:

回调不能(直接或间接地)进行CUDA API调用,因为如果进行这样的调用导致死锁,它可能会自行等待


谢谢,对不起,我错过了。事实上,如果调用是由异步保证的,那么这没有多大意义,但是好的。谢谢,对不起,我错过了。事实上,如果调用由异步保证,那么这没有多大意义,但是可以。
terminate called after throwing an instance of 'std::runtime_error'
  what():  after cudaMemcpyAsync: operation not permitted
Aborted