Код: Выделить всё
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);
// ...
}
Мой 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)
Подробнее здесь: https://stackoverflow.com/questions/781 ... eaded-mode
Мобильная версия