使用LLVM / Clang在Win10上使用OpenMP进行Cuda

时间:2017-02-09 18:01:11

标签: windows cuda clang openmp

我一直在尝试使用在Win10上使用Cuda,OpenMP和LLVM / Clang的简单应用程序。从我在网上发现的各种文档和功能点演示文稿中,我相信这种功能在某种程度上得到了支持,但我不确定它是否支持Win10以及它是否支持#10; s在主要版本中。我使用的是LLVM 4.0.0rc1。我无法以各种方式成功地从头部构建后下载了二进制文件。

我将此code修改为如下所示。我还尝试了各种OMP和C变体。它汇编得很好。您可以从verbose output看到,构建似乎是一个胖二进制文件。有趣的是,它似乎并不关心我为目标提供的内容(或者如果我给它一个目标)或者具体是在omptargets中。它还将执行由nvprof报告的cuda函数。

当我运行这个时,根据Open Hardware Monitor,我的所有四个处理器都达到了100%的使用率,但GPU上没有发生任何事情,除了分析命令的内存使用量很少。我错过了什么,或者这只是不起作用?

cudaError_t f;
int t = 999;
cudaProfilerStart();

printf("Enter\n");
#pragma omp target data map(tofrom: x[0:n],y[0:n]) map(tofrom: t,f)
    {
        f = cudaGetDevice(&t);
#pragma omp target teams num_teams(10) thread_limit(192)
#pragma omp parallel for
        for (int i = 0; i < n; i++) {
            for(int j = 0; j < 10000; j++) {
                y[i] += a * x[i];
                y[i] *= 2;
                y[i] -= x[i]/4;
                y[i] *= .99;
            }
        }
    }
cudaProfilerStop();

nvprof上的输出:

==1844== NVPROF is profiling process 1844, command: example.exe 1000000
Enter
min = inf, max = inf, avg = 0.000000 0 0
==1844== Profiling application: example.exe 1000000
==1844== Profiling result:
No kernels were profiled.

==1844== API calls:
Time(%)      Time     Calls       Avg       Min       Max  Name
 98.86%  135.83ms         1  135.83ms  135.83ms  135.83ms  cudaProfilerStart
  0.60%  819.35us        91  9.0030us       0ns  398.73us  cuDeviceGetAttribute
  0.53%  726.09us         1  726.09us  726.09us  726.09us  cuDeviceGetName
  0.00%  5.2860us         1  5.2860us  5.2860us  5.2860us  cuDeviceTotalMem
  0.00%  4.5310us         1  4.5310us  4.5310us  4.5310us  cudaGetDevice
  0.00%  2.6430us         3     881ns       0ns  2.2650us  cuDeviceGetCount
  0.00%  1.5090us         3     503ns     377ns     755ns  cuDeviceGet

1 个答案:

答案 0 :(得分:2)

我与IBM的工程师交换了电子邮件。上游fork of LLVM/Clang仍在进行中。此外还支持x86,但它是否适用于Windows是未知的。

如果你在我指向parallel-computing.pro的链接中注意到,那么有一个支持OpenMP和Cuda的旧版fork。我不确定这些项目之间的关系是什么(如果有的话)。如果你看一下更新的presentation,很明显新的fork支持OpenMP 4.0,支持4.5,而IBM则支持其Power8 CPU。这部分解释了对Windows的不确定支持。然而,我搜索了github中的代码,并注意到定义了Win32 ad Win64宏。