【问题标题】:CUDA Dynamic Parallelism Deferencing Global MemoryCUDA 动态并行性延迟全局内存
【发布时间】:2017-02-19 13:33:29
【问题描述】:

为了测试动态并行性,我编写了一个简单的代码并在 GTX1080 上使用以下命令对其进行编译。

nvcc -arch=sm_35   -dc dynamic_test.cu -o dynamic_test.o
nvcc -arch=sm_35   dynamic_test.o  -lcudadevrt -o dynamic_test

但是,输出不如预期。似乎传递给子内核的指针被取消引用。

#include <stdlib.h>
#include <stdio.h>
#include <cublas_v2.h>
#include <cuda_runtime_api.h>

__global__ void child(int *a, int *b, int *c){

        int tid = threadIdx.x;
        c[tid] = a[tid] + b[tid];
}


__global__ void Parent(int *a, int *b, int *c){

        int tid = threadIdx.x;
        const int n = 10;

        a[tid] = tid;
        b[tid] = 2*tid;
        c[tid] = -10;

        __syncthreads();
        cudaDeviceSynchronize();
        if (tid == 1){
          child<<<1,n>>>(a,b,c);
          cudaDeviceSynchronize();
        }
}


int main(){

        int *d_a, *d_b, *d_c;
        const int n = 10;
        int a[n],b[n],c[n],i;

        cudaMalloc((void**)&d_a,n*sizeof(int));
        cudaMalloc((void**)&d_b,n*sizeof(int));
        cudaMalloc((void**)&d_c,n*sizeof(int));

        Parent << < 1, n >>> (d_a,d_b,d_c);
        cudaDeviceSynchronize();

        cudaMemcpy(a,d_a,n*sizeof(int),cudaMemcpyDeviceToHost);
        cudaMemcpy(b,d_b,n*sizeof(int),cudaMemcpyDeviceToHost);
        cudaMemcpy(c,d_c,n*sizeof(int),cudaMemcpyDeviceToHost);

        for(i=0; i<n; i++){
           printf("a[%d] = %d\n",i,a[i]);
        }
        for(i=0; i<n; i++){
           printf("b[%d] = %d\n",i,b[i]);
        }
        for(i=0; i<n; i++){
           printf("c[%d] = %d\n",i,c[i]);
        }

        cudaFree(d_a); cudaFree(d_b); cudaFree(d_c);

        return 0;
}

这是输出:

a[0] = 1
a[1] = 0
a[2] = 4208446
a[3] = 0
a[4] = 0
a[5] = 0
a[6] = 0
a[7] = 0
a[8] = 0
a[9] = 0
b[0] = 3
b[1] = 0
b[2] = 4204323
b[3] = 0
b[4] = 4205312
b[5] = 0
b[6] = 4732449
b[7] = 0
b[8] = 4205680
b[9] = 0
c[0] = 194906208
c[1] = 32767
c[2] = 4204143
c[3] = 0
c[4] = 4205616
c[5] = 0
c[6] = 4732608
c[7] = 0
c[8] = 4231155
c[9] = 0

阅读编程指南,我应该能够将全局变量传递给子内核,而不会导致任何延迟。我不确定为什么输出不正确。我的最终目标是在内核中使用 cublas 库。朝这个方向提出的任何建议也会有所帮助。

【问题讨论】:

  • 这也是您的第一个 CUDA 程序吗?您知道您的 CUDA 安装工作正常吗?因为我已经编译并运行了您的代码并且它按预期工作。如果使用 cuda-memcheck 运行它会发生什么?
  • 感谢您为我指明方向。它现在正在使用 cuda 8.0。

标签: cuda dynamic-parallelism


【解决方案1】:

从 cuda 7.5 切换到 cuda 8.0 解决了这个问题。

【讨论】:

  • 当我运行你的代码时,我使用的是 CUDA 7.5,所以版本不是问题。
  • 我在集群上运行此代码,因为否则我无法访问这些显卡。可能是 7.5 的安装不正确。但是,我什至不确定是否是这种情况,因为其他没有动态并行性的 cuda 程序编译和运行良好。
猜你喜欢
  • 2013-11-13
  • 2013-11-09
  • 2020-08-17
  • 1970-01-01
  • 2012-05-06
  • 2015-03-10
  • 2011-12-20
  • 1970-01-01
相关资源
最近更新 更多