由于一些开销,将 OpenCL 与 Android JNI 一起使用会产生缓慢的代码

Using OpenCL with Android JNI produces slow code due to some overhead

我使用 OpenCL 和 OpenMP 在 android 上实现了一个算法。 OpenMP 实现 运行 比 OpenCL 慢大约 10 倍。

但总的来说,如果我从 java android 端测量时间,我得到大致相同的时间来调用和获取我的值。

例如:

Java 代码在两种情况下大致同时执行,大约 300 毫秒。更准确地说,elapsedTime 对于 OpenCL 来说有点多,也就是说 OpenCL 平均速度较慢。

查看单个 运行 次的 OpenMP 和 OpenCL 实现,OpenCL 版本总体上应该快得多。但是由于某种原因,有一个开销我找不到。

我还比较了 OpenCL 与普通本机代码(无 OpenMP),我仍然得到了相同的结果,整体 运行 时间大致相同,即使 calculateUsingOpenCL 运行 在至少快 10 倍。


想法:

编辑:

事实证明,clock() 是不可靠的(在 Android 上),因此我们改用以下方法来测量时间。用这个方法就ok了

int64_t getTimeNsec() {
    struct timespec now;
    clock_gettime(CLOCK_MONOTONIC, &now);
    return (int64_t) now.tv_sec*1000000000LL + now.tv_nsec;
}

clock_t startTimer, stopTimer;
startTimer = getTimeNsec();
    function_to_measure();
stopTimer = getTimeNsec();
__android_log_print(ANDROID_LOG_VERBOSE, APPNAME, "Runtime in milliseconds (ms): %f", (float)(stopTimer - startTimer) / 1000000.0f);

此处建议: How to obtain computation time in NDK