2015-11-24 2 views
0

UpdatecudaMallocManaged вызывает нарушение прав доступа

Я запустил (модифицированный) ниже код на другой машине с GTX 780 и он не имеет каких-либо проблем. Он по-прежнему не работает на моем «GTX 680 Ti Boost» даже с новейшими драйверами. Я собираюсь предположить, что это проблема с оборудованием.

Оригинал [Обновлено]

Я обнаружил, что если я запускаю программу несколько раз, в моем случае для сбора экспериментальных данных, иногда падает с нарушением доступа на cudaMallocManaged. Если код не сбой, это приводит к ошибке «Не удалось выделить память».

Настройка

ОС: Windows 10

GPU: GTX 650 Ti Повышение ж/вычислительная способность 3,0.

API: CUDA 7,0/7,5

компиляции команд (Windows)

NVCC code.cu -gencode = арка = compute_30, код = \ "sm_30, compute_30 \" -m -g 64 -G -o code.exe

Код

#include <iostream> 
#include <string> 

void CudaTest(std::string msg, cudaError_t err) { 
    if(err != cudaSuccess) { 
     std::string errMsg(cudaGetErrorString(err)); 
     std::cerr << msg << ": " << errMsg << std::endl; 
     std::exit(1); 
    } 
} 

int main(void) { 
    int* d_Data; 
    CudaTest("Could not allocate memory for d_Data",cudaMallocManaged(&d_Data,sizeof(int))); 
    CudaTest("Could not free memory",cudaFree(d_Data)); 
    cudaDeviceReset(); 
    return 0; 
} 

«S cript "

Вот программа, написанная на Go, которую я использую для проверки вышеуказанного кода.

package main 

import (
    "fmt" 
    "os" 
    "os/exec" 
    "strconv" 
) 

func toInt(str string) int { 
    res,err := strconv.Atoi(str) 
    if err != nil { 
     panic(fmt.Sprintf("Expected an integer but found '%s'\n",str)) 
    } 
    return res 
} 

func main() { 
    if len(os.Args) != 3 { 
     fmt.Printf("usage: %s <iterations> <program>",os.Args[0]) 
     return 
    } 

    iterations := toInt(os.Args[1]) 
    program := os.Args[2] 

    for i := 0 ; i < iterations; i++ { 
     cmd := exec.Command(program) 
     cmd.Stdout = os.Stdout 
     cmd.Stderr = os.Stdout 
     err := cmd.Run() 
     if err != nil { 
      panic(fmt.Sprintf("iteration=%d, Error running executable '%s', error: '%s'\n",i,program,err.Error())) 
     } 
    } 
} 
+1

вообще говоря, идея CUDA удалось памяти в том, что она должна устранить необходимость явного 'операций cudaMemcpy'. Я не полностью разобрал то, что вы представили, но на первый взгляд ваше направление кажется немного странным. –

+0

Это memset только от первоначальной реализации, которую я имел некоторое время назад, прежде чем перешел к управляемой памяти. Я просто оставил его, чтобы он был похож на то, что у меня есть. Я расскажу о том, что программа делает в вопросе, чтобы уточнить. – deathly809

+0

Код, похоже, работает для меня в соответствии с вашими ожиданиями на 660Ti, cuda 7.5 и win10. Возможно, попробуйте обновить драйверы? –

ответ

1

Эта проблема возникает из-за неправильного оборудования или неисправной установки CUDA. OP и другие успешно запускают код на других машинах и платформах без ошибок.

[Это сообщество вики была собрана из комментариев, чтобы получить вопрос от безответной очереди]

Смежные вопросы