Skip to content

Commit 3e2c826

Browse files
committed
proposed fix for gemm thread safety; using thread-local storage for kernel map using pre-C++-11 syntax
1 parent 1c5ba46 commit 3e2c826

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

src/library/blas/xgemm.cc

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <map>
1818
#include <string>
1919
#include <sstream>
20+
#include <thread>
2021
#include <stdio.h>
2122
#include <string.h>
2223
#include <clBLAS.h>
@@ -135,7 +136,17 @@ void makeGemmKernel(
135136
{
136137
//TODO: This will need to be converted to thread local when making clBLAS thread safe
137138
typedef std::map<std::string, cl_kernel> kernel_map_t;
138-
static kernel_map_t kernel_map;
139+
140+
#if defined( _WIN32 )
141+
__declspec( thread ) static kernel_map_t *kernel_map = 0;
142+
143+
144+
#else
145+
__thread static kernel_map_t *kernel_map = 0;
146+
#endif
147+
if (!kernel_map) {
148+
kernel_map = new kernel_map_t();
149+
}
139150

140151
cl_context clContext;
141152
cl_device_id clDevice;
@@ -159,11 +170,11 @@ void makeGemmKernel(
159170

160171
// Check if kernel exists for this device
161172
std::string key = prefix + "_" + kernelName;
162-
kernel_map_t::iterator idx = kernel_map.find(key);
173+
kernel_map_t::iterator idx = kernel_map->find(key);
163174

164175

165176
// If kernel not found for this device, set to NULL
166-
if (idx == kernel_map.end()) {
177+
if (idx == kernel_map->end()) {
167178
*clKernel = NULL;
168179
} else {
169180
*clKernel = idx->second;
@@ -251,7 +262,7 @@ void makeGemmKernel(
251262
#endif
252263

253264
std::string key = prefix + "_" + kernelName;
254-
kernel_map[key] = *clKernel;
265+
(*kernel_map)[key] = *clKernel;
255266
delete[] kernelName;
256267
}
257268

0 commit comments

Comments
 (0)