Я сделал несколько ядер для тестирования пропускной способности, и они не делают никаких полезных вычислений. Минимальный пример -
__global__ void testKernel(float* a)
{
unsigned int i = blockIdx.x*blockDim.x + threadIdx.x;
float x;
x = a[i];
}
Когда я компилирую, я получаю (что неудивительно)
предупреждение: переменная "x" была установлена, но никогда не использовалась
и ядро работает так же быстро, как пустое ядро:
__global__ void donothing()
{
}
Это указывает на то, что чтение [i] оптимизировано.
Я пробовал такие хитрости, как
volatile float x;
if(x);
(void)(x;)
и они подавляют предупреждение, но ядро все еще слишком быстро завершает работу.
Как я могу убедиться, что бесполезные инструкции действительно выполняются?
Я нашел опцию CU_JIT_OPTIMIZATION_LEVEL, но Google предоставляет в основном ссылки на документацию, а не на то, как ее использовать. Поможет ли мне этот вариант и как мне его использовать?