Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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内核中调用推力函数____C++_Cuda_Gpu_Thrust - Fatal编程技术网

C++ 在CUDA内核中调用推力函数___

C++ 在CUDA内核中调用推力函数___,c++,cuda,gpu,thrust,C++,Cuda,Gpu,Thrust,我已经了解到,CUDA的较新版本支持动态并行性,我可以使用推力::设备参数在内核函数中调用推力函数,如thrush::exclusive_scan \uuuu全局\uuuuu无效内核(int*inarray、int-n、int*result){ 外部共享内部s[]; int t=threadIdx.x; s[t]=inarray[t]; __同步线程(); 推力::排他扫描(推力::设备,s,n,结果); __同步线程(); } int main(){ //准备工作 内核(inarray,n,r

我已经了解到,CUDA的较新版本支持动态并行性,我可以使用
推力::设备
参数在内核函数中调用推力函数,如
thrush::exclusive_scan

\uuuu全局\uuuuu无效内核(int*inarray、int-n、int*result){
外部共享内部s[];
int t=threadIdx.x;
s[t]=inarray[t];
__同步线程();
推力::排他扫描(推力::设备,s,n,结果);
__同步线程();
}
int main(){
//准备工作
内核(inarray,n,result);
}
我感到困惑的是:

  • 在内核中调用推力函数时,每个线程是否调用该函数一次,并且它们都对数据进行动态并行处理
  • 如果这样做,我只需要一个线程来调用
    推力
    ,这样我就可以执行
    If
    线程idx
    ;如果不是,那么块中的线程如何相互通信,以确保对推力的调用已经完成,并且它们应该忽略它(这似乎有点虚构,因为没有一种系统的方法来确保用户的代码)。简而言之,当我在内核中使用
    推力::设备
    参数调用推力函数时,到底发生了什么
  • 内核中执行推力算法的每个线程都将执行算法的一个单独副本。内核中的线程在单个算法调用上不协作

  • 如果您已经满足CUDA动态并行(CDP)调用的所有要求(硬件/软件和编译设置),那么遇到推力算法调用的每个线程都将启动一个CDP子内核来执行推力算法(在这种情况下,CDP子内核中的线程进行合作)。如果没有,则遇到推力算法调用的每个线程都将执行该调用,就像您指定了
    推力::seq
    而不是
    推力::设备

  • 如果您希望在其他支持CDP的环境中避免CDP活动,则可以指定
    推力::seq

  • 例如,如果您打算只执行推力算法的一个副本,那么在内核代码中必须确保只有一个线程调用它,例如:

    if (!threadIdx.x) thrust::exclusive_scan(...  
    
    或类似的

  • 关于呼叫前后同步的问题与普通CUDA代码没有什么不同。如果需要块中的所有线程等待推力算法完成,请使用例如
    \uu syncthreads()
    ,(在CDP情况下使用
    cudaDeviceSynchronize()

  • 这些信息可能也会引起人们的兴趣

  • 内核中执行推力算法的每个线程都将执行算法的一个单独副本。内核中的线程在单个算法调用上不协作

  • 如果您已经满足CUDA动态并行(CDP)调用的所有要求(硬件/软件和编译设置),那么遇到推力算法调用的每个线程都将启动一个CDP子内核来执行推力算法(在这种情况下,CDP子内核中的线程进行合作)。如果没有,则遇到推力算法调用的每个线程都将执行该调用,就像您指定了
    推力::seq
    而不是
    推力::设备

  • 如果您希望在其他支持CDP的环境中避免CDP活动,则可以指定
    推力::seq

  • 例如,如果您打算只执行推力算法的一个副本,那么在内核代码中必须确保只有一个线程调用它,例如:

    if (!threadIdx.x) thrust::exclusive_scan(...  
    
    或类似的

  • 关于呼叫前后同步的问题与普通CUDA代码没有什么不同。如果需要块中的所有线程等待推力算法完成,请使用例如
    \uu syncthreads()
    ,(在CDP情况下使用
    cudaDeviceSynchronize()

  • 这些信息可能也会引起人们的兴趣