Я пытался использовать __CUDA_ARCH__
, но где-то читал, что это работает только с частью кода, относящейся к устройству. После этого я наткнулся на этот код на github: ссылка
Есть ли лучший способ добиться этого?
Я спрашиваю об этом, потому что я хотел бы определить (в коде хоста), поддерживает ли графический процессор унифицированную память, и в этом случае будет иметь место cudaMallocManaged или вместо этого будет иметь место cudaMallocs && cudaMemcpys.
Пример того, что я хотел бы сделать:
int main() {
// IF CUDA >= 6.0 && COMPUTE CAPABILITY >= 3.0
// USE cudaMallocManaged
// ELSE
// USE cudaMallocs && cudaMemcpys
// END IF
return 0;
}
__host__ cudaError_t cudaGetDeviceProperties ( cudaDeviceProp* prop, int device )
и прочитать значение из переменнойmanagedMemSupported
. Что, если я захочу скомпилировать точно такой же код с каким-нибудь старым API CUDA, в котором даже нет определения того, что такоеcudaMallocManaged
? - person   schedule 21.11.2017cudaGetDeviceProperties()
и__CUDA_ARCH__
: первый дает фактические вычислительные возможности устройства, а второй — вычислительные возможности, для которых был скомпилирован код устройства. Они могут различаться, если устройства с различными вычислительными возможностями являются двоично-совместимыми или если код PTX транслируется драйвером для фактической архитектуры. - person tera   schedule 21.11.2017cuda_runtime_api.h
имеет#define CUDART_VERSION xxxx
, который можно использовать для проверки версии API среды выполнения во время компиляции. После включения этого файла вы можете сделать что-то вроде#if CUDART_VERSION >= 6000
, чтобы проверить, является ли поддерживаемая версия API среды выполнения 6.0 или выше. Даже если это так, вы все равно должны использовать методcudaGetDeviceProperties
, описанный выше, для проверки поддержки управляемой памяти, прежде чем пытаться вызвать, например.cudaMallocManaged()
. - person Robert Crovella   schedule 21.11.2017