2015-07-04 3 views
0

Я хочу измерить производительность (чтение времени выполнения) моего кода ядра на разных устройствах, а именно на процессорах и графических процессорах. Код ядра, который я написал это:Вычислить время выполнения кода ядра в OpenCL C

__kernel void dataParallel(__global int* A) 
{ 
    sleep(10); 
    A[0]=2; 
    A[1]=3; 
    A[2]=5; 
    int pnp;//pnp=probable next prime 
    int pprime;//previous prime 
    int i,j; 
    for(i=3;i<500;i++) 
    { 
     j=0; 
     pprime=A[i-1]; 
     pnp=pprime+2; 
     while((j<i) && A[j]<=sqrt((float)pnp)) 
     { 
      if(pnp%A[j]==0) 
       { 
        pnp+=2; 
        j=0; 
       } 
      j++; 

     } 
     A[i]=pnp; 

    } 
} 

Однако мне сказали, что это не представляется возможным использовать сон() в коде ядра. Если это правда, тогда кто-то может объяснить причину, и если это не так, расскажите, как это реализовать.

Кроме того, поскольку я сказал, что хочу сравнить производительность моего процессора и графических процессоров, одним из способов достижения этого является вычисление времени выполнения кода ядра на разных устройствах, а если есть другой способ с помощью которого я мог бы заставить код запускать на всех устройствах одновременно, тогда мне просто нужно было бы указать соответствующее время окончания выполнения и это послужило бы цели! Является ли это возможным?

Аппаратные детали:

GPU: AMD FirePro W7000, NVIDIA TESLA C2075 CPU: Intel (R) Xeon (R) CPU X5660 @ 2.80GHZn

+0

Что делает функция 'sleep()' связана с измерением производительности? – talonmies

+0

У меня мог бы быть поток спать за 30 секунд и начать выполнение кода ядра на всех трех устройствах. Если время выполнения составляет 90 секунд (для 3 устройств), это означает, что код будет выполняться серийно и не параллельно, как и предполагалось, если время выполнения несколько выше 30 секунд, тогда мой код выполняется параллельно на всех трех устройствах , – ikk

+0

@talonmies вы могли бы предложить лучший способ достичь этого. Thnx – ikk

ответ

2

Однако мне сказали, что это невозможно использовать sleep() в коде ядра.

Это не то, что это невозможно; может быть. Я не знаю. Это на самом деле не указано в C. Сказав это, просто не очень хорошая идея блокировать выполнение ядра до истечения определенного периода времени. Даже в программировании общего назначения это не кажется хорошей идеей. Ваша функция должна закончить обработку как можно скорее или передать управление обратно в ядро, чтобы он мог найти что-то еще, пока он ждёт на холостых задачах.

Кроме того, поскольку я сказал, что хочу сравнить производительность моего процессора и графических процессоров, одним из способов достижения этого является вычисление времени выполнения кода ядра на разных устройствах, другим способом, с помощью которого я мог заставить код запускать все устройства одновременно, тогда мне просто нужно было бы указать соответствующее время окончания выполнения и это послужило бы цели! Является ли это возможным?

Несомненно, что-то в этом роде ... но ... Я даже не уверен, почему вы думаете, что инъекция sleep(10) в каждую задачу поможет вам; вы не объяснили это здесь. Это не похоже на требование для профилирования вашего кода (например, , проверяя его скорость). Вы когда-нибудь слышали о the XY problem? Я думаю, sleep - ваша переменная Y, в данном случае.

Я упомянул профайлинг только сейчас. Вы узнали о профилировщиках? Они делают именно то, что вы намерены делать, за исключением того, что они делают это , без необходимости писать код. Here's a tutorial on using perf to profile the Linux kernel ...

+0

У меня мог бы быть поток спать за 30 секунд и начать выполнение кода ядра на всех трех устройствах. Если время выполнения составляет 90 секунд (для 3 устройств), это означает, что код будет выполняться серийно и не параллельно, как и предполагалось, если время выполнения несколько выше 30 секунд, тогда мой код выполняется параллельно на всех трех устройствах , – ikk

+1

Спящая за любое количество секунд в ядре - это ужасная идея, потому что 1. Sleep обычно вызывает системный вызов, который говорит ядру перейти к какой-то другой задаче (может быть, ваша?), Тогда вы не получите желаемого сна. .. heh) или 2. Когда этого не произойдет, он заблокирует поток (который является * потоком ядер *, а не * вашим потоком *) до истечения этого периода времени. Это ужасно в любом случае. Сделайте то, что вы хотите сделать, но я рассказал вам, как вы можете решить свою проблему * без написания кода *. – Sebivor

Смежные вопросы