CUDA заставляет OpenMP работать в однопоточном режимеC++

Программы на C++. Форум разработчиков
Ответить
Гость
 CUDA заставляет OpenMP работать в однопоточном режиме

Сообщение Гость »

Я написал программу CUDA SGEMM, и когда мне захотелось проверить скорость с помощью многопоточной реализации ЦП, она не смогла работать в многопоточном режиме. Я изолировал реализацию ЦП в отдельном файле .cc, собрал его и запустил, и проблем не возникло. Код в .cu и изолированном .cc (одинаковый):

Код: Выделить всё

void sgemm_cpu_multi_threading(
float* A, float* B, float* C,
float alpha, float beta, const int M, const int N, const int K
) {
#pragma omp parallel for num_threads(8)
for (int m = 0; m < M; m++) {
printf("%d thread(s) can be used\n", omp_get_num_threads());
for (int n = 0; n < N; n++) {
float psum = 0.0;
for (int k = 0; k < K; k++) {
psum += A[m * K + k] * B[k * N + n];
}
C[m * N + n] = C[m * N + n] * beta + psum * alpha;
}
}
}

int main() {
omp_set_num_threads(OMP_THREADS);   // OMP_THREADS=8
// ...
sgemm_cpu_multi_threading(A, B, C, alpha, beta, M, N, K);
// ...
}
В программе CUDA printf всегда выводит «1 поток(и) может быть использован», и выполнение действительно сериализуется. В то время как изолированный чистый исполняемый файл cxx сообщает мне: «Можно использовать 8 потоков».
Мой CMakeLists.txt (CUDA). Для изолированного проекта cxx я удаляю только строки, относящиеся к CUDA.

Код: Выделить всё

cmake_minimum_required(VERSION 3.10)

project(SGEMM CUDA CXX)

if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release")
endif()

SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -fopenmp")
SET(COMPILE_CUDA True)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CUDA_ARCHITECTURES 75)

find_package(OpenMP REQUIRED)
if (OPENMP_FOUND)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
endif()

include_directories(
${CMAKE_SOURCE_DIR}/../
)

add_executable(matmul ./matmul.cu)

target_link_libraries(matmul pthread OpenMP::OpenMP_CXX)
Может кто-нибудь сказать мне, что здесь происходит? Почему я не могу правильно использовать многопоточность OpenMP в программе CUDA? Кстати, если вы хотите знать, A, B, C можно выделить с помощью new или cudaMallocHost, и это не повлияет на тот факт, что я не могу запустить программу с более чем одним поток, даже если функцию ЦП следует разделить с помощью nvcc, а затем скомпилировать и запустить на ЦП.

Подробнее здесь: https://stackoverflow.com/questions/781 ... eaded-mode
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»