如何使用threadfence / CUDA5.5

时间:2013-10-20 14:55:26

标签: c++ c visual-studio-2010 visual-studio cuda

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

请给我看一下有关threadfence()

的示例代码

我相信当我想访问内存是CUDA5.5中设备端的内核功能时,我想进行独占控制。
如果我使用所谓的“()__threadfence”,我学会了专属控制,我不知道如果我使用的是什么。

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

其他线程我想阻止访问Log_d内存之间的“lock start”〜“lock stop”以下代码,例如。

我在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


}

1 个答案:

答案 0 :(得分:2)

如果你能提供一些关于matrix_vector_multi_gpu_1_256内核函数应该做什么的更多信息,那将是件好事。

通过__threadfence(),设备等待,直到调用线程发出的所有全局和共享访问对以下内容可见:

  1. 线程块中用于共享内存访问的所有线程;
  2. 设备中用于全局内存访问的所有线程。
  3. CUDA SDK的__threadfence()中提供了使用threadFenceReduction的示例。

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

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