Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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
从每个主机线程启动CUDA流_Cuda - Fatal编程技术网

从每个主机线程启动CUDA流

从每个主机线程启动CUDA流,cuda,Cuda,我的意图是使用n个主机线程在NVidia Tesla C2050上并发创建n个流。内核是一个简单的向量乘法…我将数据平均分配到n个流中,每个流都将有并发执行/数据传输 数据是浮点型的,有时CPU/GPU和相等,有时相差很大……我想这可能是因为我的代码中丢失了同步结构,但我认为流之间没有任何同步结构是必要的,因为我希望每个CPU都有一个唯一的流来控制,我不关心线程内的异步数据复制和内核执行 以下是每个线程运行的代码: //every thread would run this method in

我的意图是使用n个主机线程在NVidia Tesla C2050上并发创建n个流。内核是一个简单的向量乘法…我将数据平均分配到n个流中,每个流都将有并发执行/数据传输

数据是浮点型的,有时CPU/GPU和相等,有时相差很大……我想这可能是因为我的代码中丢失了同步结构,但我认为流之间没有任何同步结构是必要的,因为我希望每个CPU都有一个唯一的流来控制,我不关心线程内的异步数据复制和内核执行

以下是每个线程运行的代码:

//every thread would run this method in conjunction

static CUT_THREADPROC solverThread(TGPUplan *plan)
{

    //Allocate memory
    cutilSafeCall( cudaMalloc((void**)&plan->d_Data, plan->dataN * sizeof(float)) );

    //Copy input data from CPU
    cutilSafeCall( cudaMemcpyAsync((void *)plan->d_Data, (void *)plan->h_Data, plan->dataN * sizeof(float), cudaMemcpyHostToDevice, plan->stream) );
    //to make cudaMemcpyAsync blocking
    cudaStreamSynchronize( plan->stream );

    //launch
    launch_simpleKernel( plan->d_Data, BLOCK_N, THREAD_N, plan->stream);
    cutilCheckMsg("simpleKernel() execution failed.\n");

    cudaStreamSynchronize(plan->stream);

    //Read back GPU results
    cutilSafeCall( cudaMemcpyAsync(plan->h_Data, plan->d_Data, plan->dataN * sizeof(float), cudaMemcpyDeviceToHost, plan->stream) );
    //to make the cudaMemcpyAsync blocking...               
    cudaStreamSynchronize(plan->stream);

    cutilSafeCall( cudaFree(plan->d_Data) );

    CUT_THREADEND;
}
创建多个线程并调用上述函数:

    for(i = 0; i < nkernels; i++)
            threadID[i] = cutStartThread((CUT_THREADROUTINE)solverThread, &plan[i]);

    printf("main(): waiting for GPU results...\n");
    cutWaitForThreads(threadID, nkernels);
(i=0;i threadID[i]=cutStartThread((CUT_THREADROUTINE)solverThread,&plan[i]); printf(“main():等待GPU结果…\n”); cutWaitForThreads(threadID,nkernels);
我从一个CUDA代码SDK示例中获取了此策略。正如我之前所说的,这个代码有时会工作,有时会给出任性的结果。我需要帮助修复此代码

首先,凭我的经验,凭任何想象,我都不是专家

我不明白为什么这需要多个主机线程。看起来您正在管理一个设备并将其传递给多个流。我看到这一切的方式(伪代码)

{
创建一个句柄
分配与所需流数相等的流数组

首先,从我的经验来看,我不是任何想象的专家

我不明白为什么这需要多个主机线程。似乎您正在管理一个设备并将其传递给多个流。正如我看到的那样(伪代码)

{
创建一个句柄
分配与所需流数相等的流数组
对于(int n=0;n我打赌

块,螺纹

,不包括要传递的数组的确切大小。 请提供初始化流的代码以及这些缓冲区的大小

顺便说一句,流对于与内存传输重叠的计算很有用。在每次异步调用之后同步流根本没有用。

我打赌是这样的

块,螺纹

,不包括要传递的数组的确切大小。 请提供初始化流的代码以及这些缓冲区的大小


作为旁注,流对于重叠计算和内存传输非常有用。在每次异步调用后同步流根本没有用。

我目前正在测试各种在GPU上编程的方法,多个CPU线程(每个线程控制一个流)是测试用例之一。这只是一项研究,以了解其行为。我只有cre在上面的例子中,一个GPU上有4个流。顺便说一句,我有一个测试用例,其中一个主机线程控制一个GPU上的4个流(正如您所建议的),这对一定数量的数据来说很好。我目前正在测试各种在GPU上编程的方法,多个CPU线程(每个线程控制一个流)是测试用例之一。这只是一项研究,以了解其行为。对于上面的示例,我只在一个GPU上创建了4个流。顺便说一句,我有一个测试用例,其中一个主机AD是在GPU上控制4个流(正如你所建议的),并且对于一定数量的数据来说是很好的。谢谢你指着那个方向!我的块线程尺寸是32×512,并且每个线程都在创建一个流,考虑在上面的代码> SoultStult函数中,第一行是代码> CUSTASRAMAMCREATE(和计划->流)<代码>谢谢你指着那个方向!我的块线程尺寸是32×512,每个线程都在创建一个流,考虑上面的代码> SoultStult函数。第一行是代码> CUSTASRAMAMCREATE(和计划->流)< /代码>
{
create a handle

allocate an array of streams equal to the number of streams you want

for(int n=0;n<NUM_STREAMS;n++)
{
   cudaStreamCreate(&streamArray[n]);
}

}