CUDA отключить кэш L1 только для одной переменной

есть ли способ на устройствах CUDA 2.0 отключить кэш L1 только для одной конкретной переменной? Я знаю, что можно отключить кэш L1 во время компиляции, добавив флаг -Xptxas -dlcm=cg до nvcc для всех операций с памятью. Однако я хочу отключить кэш только для чтения памяти по определенной глобальной переменной, чтобы все остальные чтения памяти проходили через кэш L1.

основываясь на поиске, который я сделал в интернете, возможным решением является код сборки PTX.

3 ответов


Как упоминалось выше, вы можете использовать встроенный PTX, вот пример:

__device__ __inline__ double ld_gbl_cg(const double *addr) {
  double return_value;
  asm("ld.global.cg.f64 %0, [%1];" : "=d"(return_value) : "l"(addr));
  return return_value;
}

вы можете легко изменить это путем замены .для 64-го фокуса .F32 из (поплавок) или .с32 (Инт) и т. д., ограничение return_value "=d " для "=f " (float) или "=r" (int)etc. Обратите внимание, что последнее ограничение перед (addr) - "l" - обозначает 64-битную адресацию, если вы используете 32-битную адресацию, это должно быть "r".


Inline PTX можно использовать для загрузки и хранения переменной. ld.cg и st.инструкции cg кэшируют только данные в L2. Операторы кэша описаны в разделе 8.7.8.1 операторы кэша PTX ISA 2.3 документ. Инструкции или интерес ld и st. Встроенный PTX описывается в использование встроенной сборки PTX в CUDA.


Если вы объявите переменную volatile, тогда он будет кэшироваться только в кэше L2 на графических процессорах Fermi. Обратите внимание, что некоторые оптимизации компилятора, такие как удаление повторяющихся нагрузок, не выполняются для изменчивых переменных, поскольку компилятор предполагает, что они могут быть записаны другим потоком.