Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.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_Gpgpu - Fatal编程技术网

Cuda 理解扭曲平行性(费米)

Cuda 理解扭曲平行性(费米),cuda,gpgpu,Cuda,Gpgpu,我有以下内核,其中每个线程(1D网格,1D块)只处理输入数组的一个元素 __global__ void normalize_fft_result(double *u_device, int n0) { //Use 1d data mapping; int tid = blockIdx.x * blockDim.x + threadIdx.x; if (tid < n0) { //Normalize Result

我有以下内核,其中每个线程(1D网格,1D块)只处理输入数组的一个元素

__global__ void normalize_fft_result(double *u_device, int n0)
{
    //Use 1d data mapping;
    int tid = blockIdx.x * blockDim.x + threadIdx.x;

    if (tid < n0)
        {
            //Normalize Result
            u_device[tid] = u_device[tid] / float(n0);
        }
}
\uuuuu全局\uuuuuu无效规范化\uFFT\u结果(双*u\u设备,int n0)
{
//使用一维数据映射;
int tid=blockIdx.x*blockDim.x+threadIdx.x;
如果(tid
我在费米GPU上运行这个程序,发现处理器加载数据到一级缓存的缓存线有128字节长。我使用的是8字节的双工,这意味着在一个事务中,一个warp中只有一半线程的指令操作数可用(128/8=16)。这意味着为了获得另一半线程的数据,一个warp需要另外一个128b事务

warp中的线程应该是并发执行的,那么在等待第二个事务期间会发生什么呢?前16个线程是等待最后16个线程,还是在其他线程等待操作数时执行指令


在任何情况下,此数据等待是否会产生不可避免的延迟?

warp调度程序将重播该指令,直到所有线程完成内存加载或存储。在CC2.x设备上,通过发出前16个线程和第二个线程来完成64位加载。如果存在额外的地址差异(例如,每个线程读取一条单独的缓存线)和每个缓存未命中,将执行额外的重放。在CC2.x设备上,在load或store指令的所有线程完成后,warp可以发出额外的独立指令


有关全局、本地和共享内存重放的更多信息,请参见

上的CUDA编程部分。warp调度程序将重放指令,直到所有线程完成内存加载或存储。在CC2.x设备上,通过发出前16个线程和第二个线程来完成64位加载。如果存在额外的地址差异(例如,每个线程读取一条单独的缓存线)和每次缓存未命中,则必须执行额外的重放。在CC2.x上,在LD指令的所有线程完成后,可以从warp发出额外的独立指令。@GregSmith:如果您想将其作为一个线程添加,这将是一个很好的答案。@GregSmith所以,这意味着warp计划程序将播放该指令两次,因为需要两次加载才能获得必要的数据?确实还有一些等待warp开始执行?是的,warp调度程序将至少重播两次指令。费米体系结构是一种延迟隐藏体系结构。为了隐藏延迟,您必须在每个SM上启动足够的扭曲,以隐藏内存和执行依赖延迟。