Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 没有CUDA代码的线程中的CUDA分段错误_C++_C_Multithreading_Cuda - Fatal编程技术网

C++ 没有CUDA代码的线程中的CUDA分段错误

C++ 没有CUDA代码的线程中的CUDA分段错误,c++,c,multithreading,cuda,C++,C,Multithreading,Cuda,我有以下代码: __global__ void testCuda() {} void wrapperLock() { std::lock_guard<std::mutex> lock(mutexCudaExecution); // changing this value to 20000 does NOT trigger "Segmentation fault" usleep(5000); runCuda(); } void runCuda()

我有以下代码:

__global__ void testCuda() {}

void wrapperLock()
{
    std::lock_guard<std::mutex> lock(mutexCudaExecution);

    // changing this value to 20000 does NOT trigger "Segmentation fault"
    usleep(5000);
    runCuda();
}

void runCuda()
{
    testCuda<<<1, 1>>>();
    cudaDeviceSynchronize();
}
\uuuu全局\uuuuuu无效testCuda(){}
void wrapperLock()
{
std::锁\保护锁(mutexCudaExecution);
//将此值更改为20000不会触发“分段故障”
美国LEEP(5000);
runCuda();
}
void runCuda()
{
testCuda();
cudaDeviceSynchronize();
}
当这些函数从大约20个线程执行时,我会得到
分段错误
。如注释中所述,将
usleep()
中的值更改为20000可以正常工作

CUDA和线程是否存在问题?

在我看来,当执行完成时,CUDA需要一点时间来恢复,即使是在无事可做的情况下。

使用单个CUDA上下文,多个主机线程应该将其CUDA工作委托给上下文所有者线程(类似于工作线程)或使用(驱动程序API)绑定上下文或者,为了不覆盖上下文资源。

使用单个CUDA上下文,多个主机线程应将其CUDA工作委托给上下文所有者线程(类似于工作线程)或使用(驱动程序API)绑定上下文,或者为了不覆盖上下文资源。

更新:

据我所知,问题是对我正在使用的统一内存的并发访问。我不得不用
std::lock_guard
包装CUDA内核调用,并访问统一内存,现在程序在高线程负载下运行了4天,没有任何问题


我必须按照Marco&Robert的建议调用每个线程,否则它会再次崩溃。

更新:

据我所知,问题是对我正在使用的统一内存的并发访问。我不得不用
std::lock_guard
包装CUDA内核调用,并访问统一内存,现在程序在高线程负载下运行了4天,没有任何问题



我必须调用每个线程-正如Marco&Robert建议的那样-
cudaSetDevice
,否则它会再次崩溃。

让我直截了当地说:您正在启动多个主机线程,而每个线程都试图启动一个CUDA内核?只有一个CUDA上下文?是的,但它们不会同时执行,因为std::lock_guard会阻止另一个CUDA内核的启动,只要前一个没有完成!这在我眼里是如此奇怪。在调用启动之前,你是否将cuda上下文与每个线程绑定?不,我正在做你看到的事情。你能给我提供更多关于“绑定”的信息吗?我该怎么办?您可以尝试放置
cudaSetDevice(0)runCuda
中,在内核调用之前进行代码>调用。我建议提供一个完整的示例。让我直截了当地说:您正在启动多个主机线程,而每个主机线程都试图启动一个CUDA内核?只有一个CUDA上下文?是的,但它们不会同时执行,因为std::lock_guard会阻止另一个CUDA内核的启动,只要前一个没有完成!这在我眼里是如此奇怪。在调用启动之前,你是否将cuda上下文与每个线程绑定?不,我正在做你看到的事情。你能给我提供更多关于“绑定”的信息吗?我该怎么办?您可以尝试放置
cudaSetDevice(0)runCuda
中,在内核调用之前进行代码>调用。我建议提供一个完整的例子,但我无法将其整理出来。如果您能为我提供一个示例代码,告诉我如何在函数runCuda()中执行操作,如何在main()中初始化它,…@AlBundy这可能会对您有所帮助:我并不真正理解这个问题。我用std::lock_guard锁定线程-这意味着始终只有一个线程使用GPU。当我使用usleep(20000)函数时,它为什么会起作用?我对上下文的理解是,当多个线程同时使用GPU时,我必须使用它。你应该像Robert和我指出的那样做,因为这应该提供一个定义的行为。如果你不是,那可能会导致未定义的行为。我会尝试用非技术性的语言解释<代码>我对上下文的理解是,当多个线程同时使用GPU时,我必须使用它。否,上下文具有线程关联性:它“属于”特定线程。如果要从另一个线程调用该上下文,则必须将该上下文“移动”到另一个线程。这并不重要,因为你同时使用GPU,重要的是你从不同的线程使用GPU。我无法整理它。如果您能为我提供一个示例代码,告诉我如何在函数runCuda()中执行操作,如何在main()中初始化它,…@AlBundy这可能会对您有所帮助:我并不真正理解这个问题。我用std::lock_guard锁定线程-这意味着始终只有一个线程使用GPU。当我使用usleep(20000)函数时,它为什么会起作用?我对上下文的理解是,当多个线程同时使用GPU时,我必须使用它。你应该像Robert和我指出的那样做,因为这应该提供一个定义的行为。如果你不是,那可能会导致未定义的行为。我会尝试用非技术性的语言解释<代码>我对上下文的理解是,当多个线程同时使用GPU时,我必须使用它。
否,上下文具有线程关联性:它“属于”特定线程。如果要从另一个线程调用该上下文,则必须将该上下文“移动”到另一个线程。这并不重要,因为你同时使用GPU,重要的是你从不同的线程使用GPU。我真的不明白为什么有人认为这个答案没有用!我承认我犯了一个错误,答案应该有助于其他人在发布之前先检查他们的代码。我至少有权管理自己的错误/b