我一直在尝试使用在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
答案 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宏。