我一直在试图获得一个在Win10上使用Cuda,OpenMP和LLVM / Clang的简单应用程序。 从我在网上find的各种文档和function点演示文档来看,我相信这种function是以某种方式得到支持的,但是我不确定Win10是否支持这种function,以及它是否在主要版本中。 我正在使用LLVM 4.0.0rc1。 我以各种方式从头部成功构build之后下载了二进制文件。
我修改了这段代码 ,看起来像下面这样。 我也尝试过不同的OMP和C变种。 它编译好。 你可以从详细的输出中看到,构build看起来正在变成一个胖二进制文件。 有趣的是,我似乎并不关心我为某个目标(或者如果我给它一个目标)提供了什么,或者是什么特别是在omptargets中。 它也会执行由nvprof报告的cuda函数。
当我运行这个时,根据开放式硬件监视器 ,我的四个处理器都达到了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
我与IBM的一名工程师交换了电子邮件。 上游LLVM / Clang的分支仍在进行中。 也有支持x86,但它是否在Windows上工作是未知的。
如果你在我的parallel-computing.pro链接中注意到,有一个支持OpenMP和Cuda的旧叉。 我不确定这些项目之间的关系是什么,如果有的话。 如果您看一下最近的演示文稿 ,很明显新版本的分支支持OpenMP 4.0,支持4.5版本,而IBM正在为Power8 CPU提供支持。 这部分解释了对Windows的不确定支持。 然而,我通过github中的代码搜索,并指出Win32和Win64宏的定义。