0

所以,我想知道如何使用 threadfence,我想阅读有关 threadfence 的示例代码。

请告诉我有关 threadfence() 的示例代码

我相信当我想访问内存是CUDA5.5中设备端的内核功能时,我想进行独占控制。
我了解到,如果我使用所谓的“()__threadfence”,则可以进行独占控制,但我不知道如何使用。

· 我能做些什么?
(现在,“__threadfence()”出现未定义标识的错误)
·我在哪里写的源代码上的代码。因为我想我想专门控制你想在下面的代码中访问 Log_d 的地方。

其他线程我想阻止在“锁定开始”~“锁定停止”以下代码之间访问 Log_d 的内存,例如。

我在 CPU 端代码中定义了块和线程。块:1,1,1 和线程:256,1,1

__global__ void matrix_vector_multi_gpu_1_256(float *A_d, float *B_d, float *C_d, float *Log_d){
    int i;

    A_d[threadIdx.x]=0.0F;

    for(i=0;i<N;i++){
        A_d[threadIdx.x]=A_d[threadIdx.x]+B_d[threadIdx.x*N+i]*C_d[i];
    }
    //lock Start about Log_d
    //__threadfence();
    for(int j=0;j<N;j++){
        if(Log_d[j]==0){
            Log_d[j]=threadIdx.x + 1;
            break;
        }
    }
    //Stop the lock


}
4

1 回答 1

2

如果您能提供更多关于matrix_vector_multi_gpu_1_256内核函数应该做什么的信息,那就太好了。

通过__threadfence(),设备将等待,直到调用线程进行的所有全局和共享访问对以下人员可见:

  1. 用于共享内存访问的线程块中的所有线程;
  2. 设备中用于全局内存访问的所有线程。

CUDA SDK__threadfence()中提供了一个使用示例。threadFenceReduction

在示例中,在单个内核调用中对任意大小的数组执行归约。线程块执行部分缩减,内核通过全局计数器的原子增量来跟踪已完成的块数。如果票据值等于线程块的数量,那么持有票据的块知道它是最后一个完成的块。最后一个块负责对所有其他块的结果求和。

为了使这种方法正常工作,必须确保在一个块取票之前,它的所有内存事务都已完成。这是由__threadfence().

于 2013-10-20T21:18:59.193 回答